假设我们有一个参差不齐的嵌套序列,如下所示:
import numpy as np
x = np.ones((10, 20))
y = np.zeros((10, 20))
a = [[0, x], [y, 1]]
并希望在必要时创建一个完整 numpy
的数组来广播参差不齐的子序列(以匹配任何其他子序列的最大维度,在这种情况下(10,20)
)。首先,我们可能会尝试使用np.array(a)
,这会产生警告:
VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
通过更改为np.array(a, dtype=object)
,我们确实得到了一个数组。但是,这是一个对象数组而不是浮点数,并且保留了未按需要广播的参差不齐的子序列。为了解决这个问题,我创建了一个新函数to_array
,它采用(可能是参差不齐的、嵌套的)序列和一个形状并返回该形状的完整 numpy 数组:
def to_array(a, shape):
a = np.array(a, dtype=object)
b = np.empty(shape)
for index in np.ndindex(a.shape):
b[index] = a[index]
return b
b = np.array(a, dtype=object)
c = to_array(a, (2, 2, 10, 20))
print(b.shape, b.dtype) # prints (2, 2) object
print(c.shape, c.dtype) # prints (2, 2, 10, 20) float64
请注意c
,不是b
,是期望的结果。但是,to_array
依赖于nindex上的 for 循环,Python for 循环对于大数组来说很慢。
是否有替代的矢量化方法来编写to_array
函数?