如何创建一个全部为 True 或全部为 False 的 numpy 数组?

Posted

技术标签:

【中文标题】如何创建一个全部为 True 或全部为 False 的 numpy 数组?【英文标题】:How to create a numpy array of all True or all False? 【发布时间】:2014-02-06 03:18:29 【问题描述】:

在 Python 中,如何创建一个任意形状的 numpy 数组,其中填充全部为 True 或全部为 False?

【问题讨论】:

【参考方案1】:

numpy 允许非常轻松地创建全为 1 或全为零的数组:

例如numpy.ones((2, 2))numpy.zeros((2, 2))

由于TrueFalse 在Python 中分别表示为10,因此我们只需使用可选的dtype 参数指定此数组应为布尔值,我们就完成了。

numpy.ones((2, 2), dtype=bool)

返回:

array([[ True,  True],
       [ True,  True]], dtype=bool)

更新日期:2013 年 10 月 30 日

由于 numpy version 1.8,我们可以使用 full 来实现相同的结果,其语法更清楚地表明了我们的意图(正如 fmonegaglia 指出的那样):

numpy.full((2, 2), True, dtype=bool)

更新日期:2017 年 1 月 16 日

由于至少numpy version 1.12,full 自动将结果转换为第二个参数的dtype,所以我们可以直接写:

numpy.full((2, 2), True)

【讨论】:

dtype=int 初始化数组不能用于数组元素选择。 这行得通。但是,要小心,因为正如@Jichao 所说,a=np.ones((2,2)) 后跟a.dtype=bool 不起作用。 answer 假定具有 dtype bool 的 np.ones 或 np.zeros 必须将 int 数组转换为布尔值。这个假设是真的吗?我认为它会创建布尔数组并且不会先创建 int 数组然后再进行转换。如果我是对的,请更正这个答案【参考方案2】:
numpy.full((2,2), True, dtype=bool)

【讨论】:

+1 我认为这应该是公认的答案。用布尔值填充数组似乎比用数字填充将它们转换为布尔值更自然。 oneszeros 答案不构造整数数组。他们直接构建了一个布尔数组。 numpy.full((2,2), True) 是等价的吗? 它在 numpy 1.12+ 中。我不记得它是否适用于以前的版本 Surly dtype 是否尽可能与数据本身分开存储?我无法想象 numpy 做任何繁重的工作来将 int 1 转换为 bool True【参考方案3】:

oneszeros,分别创建全为 1 和 0 的数组,采用可选的 dtype 参数:

>>> numpy.ones((2, 2), dtype=bool)
array([[ True,  True],
       [ True,  True]], dtype=bool)
>>> numpy.zeros((2, 2), dtype=bool)
array([[False, False],
       [False, False]], dtype=bool)

【讨论】:

【参考方案4】:

如果它不必是可写的,您可以使用np.broadcast_to 创建这样一个数组:

>>> import numpy as np
>>> np.broadcast_to(True, (2, 5))
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

如果你需要它可写,你也可以自己创建一个空数组并fill它:

>>> arr = np.empty((2, 5), dtype=bool)
>>> arr.fill(1)
>>> arr
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

这些方法只是替代建议。一般来说,您应该像其他答案所建议的那样坚持使用np.fullnp.zerosnp.ones

【讨论】:

【参考方案5】:

Michael Currie 回答的基准

import perfplot

bench_x = perfplot.bench(
    n_range= range(1, 200),
    setup  = lambda n: (n, n),
    kernels= [
        lambda shape: np.ones(shape, dtype= bool),
        lambda shape: np.full(shape, True)
    ],
    labels = ['ones', 'full']
)

bench_x.show()

【讨论】:

【参考方案6】:

赶紧跑个timeit看看np.fullnp.ones版本有什么区别。

答案:

import timeit

n_array, n_test = 1000, 10000
setup = f"import numpy as np; n = n_array;"

print(f"np.ones: timeit.timeit('np.ones((n, n), dtype=bool)', number=n_test, setup=setup)s")
print(f"np.full: timeit.timeit('np.full((n, n), True)', number=n_test, setup=setup)s")

结果:

np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s

重要

关于np.empty的帖子(我无法评论,因为我的声誉太低了):

不要那样做。不要使用np.empty 来初始化一个全True 数组

由于数组为空,内存没有写入,也无法保证你的值是什么,例如

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]

【讨论】:

【参考方案7】:
>>> a = numpy.full((2,4), True, dtype=bool)
>>> a[1][3]
True
>>> a
array([[ True,  True,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)

numpy.full(大小,标量值,类型)。还有其他参数可以传递,有关文档,请查看https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

【讨论】:

好吧,another answer 已经使用 np.full 回答了 - 一年多以前!

以上是关于如何创建一个全部为 True 或全部为 False 的 numpy 数组?的主要内容,如果未能解决你的问题,请参考以下文章

我有一个有时返回 True,有时返回 False 的函数。我如何计算真假?

python之路18内置函数

Python学习-函数补充2-内置函数

C中#如何对textBox输入的数据进行数据检验

python 内置方法

如何通过获取nodes.text并设置为true或false来填充Treeview node.checked为true或false