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))
由于True
和False
在Python中表示为1
和0
,分别,我们只有指定这个数组应该使用可选的是布尔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)
fmo*_*lia 86
numpy.full((2,2), True, dtype=bool)
Run Code Online (Sandbox Code Playgroud)
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.zeros
或np.ones
像其他答案建议.
赶紧跑个时间看看,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")
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)