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

Mic*_*rie 178 python arrays boolean numpy numpy-ndarray

在Python中,如何创建一个任意形状的numpy数组,其中包含所有True或全部False?

Mic*_*rie 255

numpy已经允许非常容易地创建所有的或全部为零的数组:

例如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)
Run Code Online (Sandbox Code Playgroud)

更新: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)

  • 您是否在发布问题的同一分钟内回答了自己的问题? (31认同)
  • @ M4rtini SO允许您同时发布问题和答案. (23认同)
  • 现在著名的梅梅:http://devhumor.com/media/when-you-re-a-freelance-programmer-and-don-t-have-time-to-wait-for-answers?utm_content=buffer46f36&utm_medium=social&utm_source = facebook.com utm_campaign =缓冲器 (6认同)

fmo*_*lia 86

numpy.full((2,2), True, dtype=bool)
Run Code Online (Sandbox Code Playgroud)

  • +1我认为这应该是公认的答案.用bool填充数组似乎更自然,而不是用数字填充它们以使它们变成bool. (12认同)
  • `ones`和`zeros`答案不构造整数数组.他们直接建立了一系列bools. (5认同)

use*_*ica 27

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)
Run Code Online (Sandbox Code Playgroud)


MSe*_*ert 10

如果它不必是可写的,你可以创建这样一个数组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)
Run Code Online (Sandbox Code Playgroud)

如果你需要它可写,你也可以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)
Run Code Online (Sandbox Code Playgroud)

这些方法只是替代建议.一般来说,你应该坚持np.full,np.zerosnp.ones像其他答案建议.


Jos*_*hua 5

赶紧跑个时间看看,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")
Run Code Online (Sandbox Code Playgroud)

结果:

np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s
Run Code Online (Sandbox Code Playgroud)


重要的

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

不要那样做。不要np.empty用于初始化全True数组

由于数组为空,因此不会写入内存并且无法保证您的值是什么,例如

np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s
Run Code Online (Sandbox Code Playgroud)


小智 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明