如何在 NP 数组中填充第 3 维?
How to pad a 3rd dimention in an array of NP arrays?
我想用零填充数组的第 3 维,这是我尝试的方法:
import numpy as np
arr = [np.array([[1,2,3], [1,2,3]]), np.array([[1,2],[2,3,4, 5]])]
lar = []
for r in arr:
for e in r:
lar.append(len(e))
i = max(lar)
for (ii, r) in enumerate(arr):
for (i, e) in enumerate(r):
print(i)
print(e)
arr[ii][i]= np.pad(e, (0,i), 'constant' )
print(i)
print(lar)
print(arr)
然而,一旦它不得不调整第一个子数组,它就失败了,期望的结果:
[[[1,2,3,0]
[1,2,3,0]],
[[1,2,0,0],
[2,3,4,5]]]
让我们从 Numpy 不 支持交错数组(不同
任何维度的长度)。
另一个要提到的细节是你的源“数组”(arr)实际上不是任何数组,
但是 list 的 Numpy 数组。
此列表的每个元素是:
- “常规”二维 Numpy 数组(如果所有大小都相同
每个维度),
- 或一维数组,包含列表(不同大小)和整个
元素是 object 类型的数组。
所以解决这个问题的正确方法是用两种不同的方式进行填充,
根据每一行的类型。
编写如下函数:
def myPad(arr):
lar = []
for r in arr:
for e in r:
lar.append(len(e))
n = max(lar)
rv = []
for row in arr:
if row.ndim == 1: # A jagged array (1-D array of lists (of different lengths))
rv.append(np.array([ col + [0] * (n - len(col)) for col in row ]))
else: # 2-D array (all rows of same length)
rv.append(np.pad(row, ((0, 0), (0, n - row.shape[1]))))
return np.array(rv)
它从您的代码开始确定目标大小(n)。
然后有一个循环,处理每一行,根据“fork”(if)
当前行的维数;
- if路径处理“锯齿状”数组的情况,
- else路径处理“常规”数组的情况。
当你打电话时:
result = myPad(arr)
源数据的结果是:
array([[[1, 2, 3, 0],
[1, 2, 3, 0]],
[[1, 2, 0, 0],
[2, 3, 4, 5]]])
它的形状(result.shape)是:
(2, 2, 4)
我想用零填充数组的第 3 维,这是我尝试的方法:
import numpy as np
arr = [np.array([[1,2,3], [1,2,3]]), np.array([[1,2],[2,3,4, 5]])]
lar = []
for r in arr:
for e in r:
lar.append(len(e))
i = max(lar)
for (ii, r) in enumerate(arr):
for (i, e) in enumerate(r):
print(i)
print(e)
arr[ii][i]= np.pad(e, (0,i), 'constant' )
print(i)
print(lar)
print(arr)
然而,一旦它不得不调整第一个子数组,它就失败了,期望的结果:
[[[1,2,3,0]
[1,2,3,0]],
[[1,2,0,0],
[2,3,4,5]]]
让我们从 Numpy 不 支持交错数组(不同 任何维度的长度)。
另一个要提到的细节是你的源“数组”(arr)实际上不是任何数组, 但是 list 的 Numpy 数组。
此列表的每个元素是:
- “常规”二维 Numpy 数组(如果所有大小都相同 每个维度),
- 或一维数组,包含列表(不同大小)和整个 元素是 object 类型的数组。
所以解决这个问题的正确方法是用两种不同的方式进行填充, 根据每一行的类型。
编写如下函数:
def myPad(arr):
lar = []
for r in arr:
for e in r:
lar.append(len(e))
n = max(lar)
rv = []
for row in arr:
if row.ndim == 1: # A jagged array (1-D array of lists (of different lengths))
rv.append(np.array([ col + [0] * (n - len(col)) for col in row ]))
else: # 2-D array (all rows of same length)
rv.append(np.pad(row, ((0, 0), (0, n - row.shape[1]))))
return np.array(rv)
它从您的代码开始确定目标大小(n)。
然后有一个循环,处理每一行,根据“fork”(if) 当前行的维数;
- if路径处理“锯齿状”数组的情况,
- else路径处理“常规”数组的情况。
当你打电话时:
result = myPad(arr)
源数据的结果是:
array([[[1, 2, 3, 0],
[1, 2, 3, 0]],
[[1, 2, 0, 0],
[2, 3, 4, 5]]])
它的形状(result.shape)是:
(2, 2, 4)