我如何创建一个numpy数组的所有真或所有假?

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

349464 次浏览

答案是:

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

解释:

Numpy很容易创建全1或全0的数组:

例如: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 版本1.8,我们可以使用full来实现同样的结果,语法更清楚地显示了我们的意图(正如fmonegaglia指出的那样):

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

更新:2017年1月16日

因为至少numpy 版本1.12full自动转换为第二个参数的dtype,所以我们可以这样写:

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

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)
numpy.full((2,2), True, dtype=bool)
>>> 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

如果它不一定是可写的,你可以用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

快速运行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
< p > < br > 重要的< / >强

关于关于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]]

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()

enter image description here