在Python中,如何创建一个任意形状的numpy数组,填充所有True或所有False?
True
False
答案是:
numpy.full((2, 2), True)
解释:
Numpy很容易创建全1或全0的数组:
例如:numpy.ones((2, 2))或numpy.zeros((2, 2))
numpy.ones((2, 2))
numpy.zeros((2, 2))
由于True和False在Python中分别表示为1和0,我们只需要使用可选参数dtype指定该数组应为布尔值,就完成了:
1
0
dtype
numpy.ones((2, 2), dtype=bool)
返回:
array([[ True, True], [ True, True]], dtype=bool)
更新日期:2013年10月30日
由于numpy 版本1.8,我们可以使用full来实现同样的结果,语法更清楚地显示了我们的意图(正如fmonegaglia指出的那样):
full
numpy.full((2, 2), True, dtype=bool)
更新:2017年1月16日
因为至少numpy 版本1.12, full自动转换为第二个参数的dtype,所以我们可以这样写:
ones和zeros分别创建充满1和0的数组,有一个可选参数dtype:
ones
zeros
>>> 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创建这样一个数组:
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:
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。
np.full
np.zeros
np.ones
快速运行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
不要那样做。不要使用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()