重塑 numpy 数组,使其类似于具有任意嵌套子数组的不同数组



我有两个数组ab。 如果我运行a.shape我会得到(10,),如果我运行(b.shape)我会得到(10,)但是这些值中的每一个都是任意嵌套的数组,它们本身的形状不等于其他数组或另一个数组中的相应值。 例如,a[0].shape返回(122,)b[0].shape返回(3900,)b[5].shape返回(5200,64)因此它们在同一数组中甚至不一致。

我知道他们使用在 Python 中迭代多维数组中找到的递归解决方案具有相同的元素总数(似乎没有标准的 numpy 函数能够根据需要深入到数组中):

def iterThrough(lists):
if not hasattr(lists[0], '__iter__'):
for val in lists:
yield val
else:
for l in lists:
for val in iterThrough(l):
yield val
si = 0
for value in iterThrough(a): #and b
si += 1

两者都返回3066752. 我知道这很混乱,但我需要它以这种形状来计算以后的数学函数,我猜这样做比重写该方程以反映格式良好的数组更容易。

如何使数组a的所有嵌套形状与数组b完全相同?

这是一个可以完成这项工作的解决方案,但保证很慢,因为它是递归的、迭代的,并且根本不矢量化:

import copy
# Generator function:
# Returns successive scalars from any crazily nested array
def arr_values(arr):
for elem in arr:
if (isinstance(elem, np.ndarray)):
for sub_arr_elem in arr_values(elem):
yield sub_arr_elem
else:
yield elem
# Generator function:
# Returns successive tuples (vector, index) from any arbitrarily nested array,
# such that assigning a value to vector[index] is the same as assigning the value
# to a position in the input array.
def arr_positions(arr):
for pos,elem in enumerate(arr):
if (isinstance(elem, np.ndarray)):
for inner_arr_pos in arr_positions(elem):
yield inner_arr_pos
else:
yield arr, pos
# Create a new array, having the shape of `b` (and incidentally, b's data also)
arr_in_shape_of_b = copy.deepcopy (b)
# Get the iterator for successive assignable positions in
# our destination array
iter_dest = arr_positions(arr_in_shape_of_b)
# Get the iterator for successive scalars from our source array
iter_src = arr_values(a)
# Now, iterate over the two iterators in tandem, and
# perform assignment of successive values from source,
# into successive positions in destination.
for ((dest_vec, pos), val) in zip(iter_dest, iter_src):
dest_vec[pos] = val

测试一下:

我用这个演示数据进行了测试,ab

a = np.array ([np.arange(6).reshape(2,3), np.array([np.arange(8).astype(np.ndarray),
23], dtype=np.ndarray),24], dtype=np.ndarray)
print (a.shape)
print (a)
b = np.roll(-1 * a, 2, axis=0)
print (b.shape)
print (b)

因此,输入数组ab如下所示:

(3,)
[array([[0, 1, 2],
[3, 4, 5]])
array([array([0, 1, 2, 3, 4, 5, 6, 7], dtype=object), 23], dtype=object)
24]
(3,)
[array([array([0, -1, -2, -3, -4, -5, -6, -7], dtype=object), -23],
dtype=object)
-24 array([[ 0, -1, -2],
[-3, -4, -5]])]

输出如下所示:

(3,)
[array([array([0, 1, 2, 3, 4, 5, 0, 1], dtype=object), 2], dtype=object) 3
array([[ 4,  5,  6],
[ 7, 23, 24]])]

最新更新