如何创建一个由所有 True 或所有 False 组成的 numpy 数组?

294
在Python中,我如何创建一个任意形状的numpy数组,填充所有元素为True或所有元素为False
7个回答

414

答案:

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

解释:

使用numpy可以很容易地创建全1或全0的数组:

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

由于Python中TrueFalse分别表示为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.12以来,full函数会自动转换为第二个参数的dtype,所以我们只需写:

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

1
dtype=int类型的初始化数组不能用于数组元素选择。 - Jichao
1
这个是有效的。但是要小心,因为正如@Jichao所说,a=np.ones((2,2))后面跟着a.dtype=bool是无法实现的。 - medley56
答案假设np.ones或np.zeros与dtype bool一起使用时必须将int数组转换为布尔值。这个假设是正确的吗?我认为它会创建布尔数组,而不是先创建int数组再进行转换。如果我是对的,请纠正这个答案。 - Alok Nayak

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

13
我认为这应该是被采纳的答案。用布尔值填充数组似乎比用数字填充再强制转换更加自然。 - Zelphir Kaltstahl
6
“1”和“0”的答案并不构成整数数组,它们直接构成布尔类型的数组。 - user2357112
1
numpy.full((2,2), True) 是等价的吗? - Pavel
它在numpy 1.12+中。我不记得它是否适用于早期版本。 - fmonegaglia
1
全是1或0的代码通常比较快,而全是其他数字的代码则往往比较慢。 - MrE
显示剩余2条评论

33

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)

9
如果不需要可写,则可以使用 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


7
迈克尔·柯瑞的回答基准测试
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


1
很高兴看到full只有固定的时间惩罚,而不是根据数组大小而变化的时间惩罚。因此,数组越大,这种差异就越不重要。 - Michael Currie

5

快速运行了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]]

-1

6
好的,另一个答案已经在一年前使用np.full进行了回答! - MSeifert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接