[英]Reshaping numpy array to be similar to different array with arbitrarily nested subarrays
我有两个 arrays a
和b
。 如果我运行a.shape
我得到(10,)
并且如果我运行(b.shape)
我得到(10,)
但是这些值中的每一个都是任意嵌套的 arrays ,它们在形状上不等于其他本身或另一个数组中的对应值。 例如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
。 我知道这很混乱,但是我需要它处于那种形状才能稍后计算数学 function,我猜这样做比重写该方程以反映格式良好的数组更容易。
如何使数组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
测试一下:
我用这个演示数据测试了a
和b
:
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)
因此,输入 arrays a
和b
如下所示:
(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]])]
output 看起来像这样:
(3,)
[array([array([0, 1, 2, 3, 4, 5, 0, 1], dtype=object), 2], dtype=object) 3
array([[ 4, 5, 6],
[ 7, 23, 24]])]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.