如何创建一个全部为 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))
由于True
和False
在Python 中分别表示为1
和0
,因此我们只需使用可选的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 我认为这应该是公认的答案。用布尔值填充数组似乎比用数字填充将它们转换为布尔值更自然。ones
和 zeros
答案不构造整数数组。他们直接构建了一个布尔数组。
numpy.full((2,2), True)
是等价的吗?
它在 numpy 1.12+ 中。我不记得它是否适用于以前的版本
Surly dtype 是否尽可能与数据本身分开存储?我无法想象 numpy 做任何繁重的工作来将 int 1
转换为 bool True
。【参考方案3】:
ones
和 zeros
,分别创建全为 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.full
、np.zeros
或np.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.full
和np.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 的函数。我如何计算真假?
如何通过获取nodes.text并设置为true或false来填充Treeview node.checked为true或false