我有以下代码:
r = numpy.zeros(shape = (width, height, 9))
它创建了一个宽x高x 9的矩阵,全是0。相反,我想知道是否有一个函数或方法,以一种简单的方式将它们初始化为nan。
我有以下代码:
r = numpy.zeros(shape = (width, height, 9))
它创建了一个宽x高x 9的矩阵,全是0。相反,我想知道是否有一个函数或方法,以一种简单的方式将它们初始化为nan。
当前回答
只是一个警告,使用np.empty()初始化而不随后编辑值可能会导致(内存分配?)问题:
arr1 = np.empty(96)
arr2 = np.empty(96)
print(arr1)
print(arr2)
# [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1. 1.
# 1. 1. 2. 2. 2. 2. nan nan nan nan nan nan nan nan 0. 0. 0. 0.
# 0. 0. 0. 0. nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan]
#
# [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1. 1.
# 1. 1. 2. 2. 2. 2. nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan]
在数组中初始化的浮点数在我的脚本中的其他地方使用,但与变量arr1或arr2根本没有关联。令人毛骨悚然的。
来自用户@JHBonarius的回答解决了这个问题:
arr = np.tile(np.nan, 96)
print(arr)
# [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan]
其他回答
我比较了建议的替代方案的速度,发现对于足够大的向量/矩阵来填充,除了val * ones和array(n * [val])之外的所有替代方案都同样快。
代码重现情节:
import numpy
import perfplot
val = 42.0
def fill(n):
a = numpy.empty(n)
a.fill(val)
return a
def colon(n):
a = numpy.empty(n)
a[:] = val
return a
def full(n):
return numpy.full(n, val)
def ones_times(n):
return val * numpy.ones(n)
def list(n):
return numpy.array(n * [val])
b = perfplot.bench(
setup=lambda n: n,
kernels=[fill, colon, full, ones_times, list],
n_range=[2 ** k for k in range(20)],
xlabel="len(a)",
)
b.save("out.png")
如前所述,numpy.empty()是可行的方法。然而,对于对象,fill()可能并不完全像你想象的那样:
In[36]: a = numpy.empty(5,dtype=object)
In[37]: a.fill([])
In[38]: a
Out[38]: array([[], [], [], [], []], dtype=object)
In[39]: a[0].append(4)
In[40]: a
Out[40]: array([[4], [4], [4], [4], [4]], dtype=object)
一种方法可以是:
In[41]: a = numpy.empty(5,dtype=object)
In[42]: a[:]= [ [] for x in range(5)]
In[43]: a[0].append(4)
In[44]: a
Out[44]: array([[4], [], [], [], []], dtype=object)
>>> width = 2
>>> height = 3
>>> r = np.full((width, height, 9), np.nan)
>>> print(r)
array([[[nan, nan, nan, nan, nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan, nan, nan, nan, nan]],
[[nan, nan, nan, nan, nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan, nan, nan, nan, nan]]])
>>> r.shape
(2, 3, 9)
请原谅我的迟到,但这里是大型数组的最快解决方案,iff单精度(f4 float32)是你所需要的。是的,np。南也在工作。
def full_single_prec(n):
return numpy.full(n, val, dtype='f4')
另一种替代方法是numpy.broadcast_to(val,n),它在常量时间内返回,与大小无关,也是内存效率最高的(它返回重复元素的视图)。需要注意的是返回值是只读的。
下面是使用与Nico Schlömer的答案相同的基准测试提出的所有其他方法的性能比较。