我有幾個包含坐標的 numpy 二維陣列。我想將所有這些 2D 陣列組合成一個 3D 陣列(坐標串列),所有缺少的坐標都用 [0,0] 填充,以使每個串列的大小相同。我有一些使用 np.pad 將 1D 陣列組合到 2D 的東西,但不能讓它從 2D 到 3D。
例如:
[[0.1,0.1], [0.2,0.2], [0.3,0.3]]
現在,二維陣列有不同的大小,即持有不同數量的坐標。上面是一個 (2,3) 陣列。我可能有(2,5)和(2,8)和(2,6)。
因此,以上面的示例和下面的兩個陣列為例:
[[0.2,0.2], [0.2,0.2], [0.2,0.2], [0.2,0.2], [0.2,0.2]]
[[0.3,0.3], [0.3,0.3], [0.3,0.3], [0.3,0.3]]
結果將是(為清楚起見添加了空格):
[
[[0.1,0.1], [0.2,0.2], [0.3,0.3], [0.0,0.0], [0.0,0.0]]
[[0.2,0.2], [0.2,0.2], [0.2,0.2], [0.2,0.2], [0.2,0.2]]
[[0.3,0.3], [0.3,0.3], [0.3,0.3], [0.3,0.3], [0.0,0.0]]
]
注意最終的形狀是 (2,5,3),第一行切片已填充 2 [0,0],第三行切片已填充 1 [0,0]
感謝任何幫助!
uj5u.com熱心網友回復:
也許有人會提供很棒的 NumPy 魔法來直接執行此操作,但與此同時,您可以填充 Python 回圈并在之后形成一個陣列:
# the padding element
pad = [0.0, 0.0]
# the coords
data = [
[[0.1,0.1], [0.2,0.2], [0.3,0.3]],
[[0.2,0.2], [0.2,0.2], [0.2,0.2], [0.2,0.2], [0.2,0.2]],
[[0.3,0.3], [0.3,0.3], [0.3,0.3], [0.3,0.3]],
]
# do the padding
maxl = max(len(v) for v in data)
for v in data:
npad = maxl - len(v)
v.extend([pad] * npad)
# convert to a NumPy array
data = np.array(data)
# data is now (3,5,2), you can reshape as needed:
array([[[0.1, 0.1],
[0.2, 0.2],
[0.3, 0.3],
[0. , 0. ],
[0. , 0. ]],
[[0.2, 0.2],
[0.2, 0.2],
[0.2, 0.2],
[0.2, 0.2],
[0.2, 0.2]],
[[0.3, 0.3],
[0.3, 0.3],
[0.3, 0.3],
[0.3, 0.3],
[0. , 0. ]]])
uj5u.com熱心網友回復:
通過找到最大陣列長度,我們可以根據該長度填充陣列,只需 NumPy 即可:
a = np.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]])
b = np.array([[0.2, 0.2], [0.2, 0.2], [0.2, 0.2], [0.2, 0.2], [0.2, 0.2]])
c = np.array([[0.3, 0.3], [0.3, 0.3], [0.3, 0.3], [0.3, 0.3]])
max_len = max(a.shape[0], b.shape[0], c.shape[0])
pad_fill = np.array([0.0, 0.0])
A_pad = np.pad(a, ((0, max_len - a.shape[0]), (0, 0)), constant_values=pad_fill)
B_pad = np.pad(b, ((0, max_len - b.shape[0]), (0, 0)), constant_values=pad_fill)
C_pad = np.pad(c, ((0, max_len - c.shape[0]), (0, 0)), constant_values=pad_fill)
# A_pad: [[0.1 0.1] [0.2 0.2] [0.3 0.3] [0. 0. ] [0. 0. ]]
# B_pad: [[0.2 0.2] [0.2 0.2] [0.2 0.2] [0.2 0.2] [0.2 0.2]]
# C_pad: [[0.3 0.3] [0.3 0.3] [0.3 0.3] [0.3 0.3] [0. 0. ]]
然后使用一些代碼np.concotenate,如你想要的組合它們:
np.concatenate((A_pad, B_pad, C_pad), axis=0).reshape(3, 5, 2)
# [[[0.1 0.1] [0.2 0.2] [0.3 0.3] [0. 0. ] [0. 0. ]]
# [[0.2 0.2] [0.2 0.2] [0.2 0.2] [0.2 0.2] [0.2 0.2]]
# [[0.3 0.3] [0.3 0.3] [0.3 0.3] [0.3 0.3] [0. 0. ]]]
uj5u.com熱心網友回復:
使用itertools.zip_longest:
from itertools import zip_longest
d = [
[[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]],
[[0.2, 0.2], [0.2, 0.2], [0.2, 0.2], [0.2, 0.2], [0.2, 0.2]],
[[0.3, 0.3], [0.3, 0.3], [0.3, 0.3], [0.3, 0.3]],
]
out = list(zip(*zip_longest(*d, fillvalue=[0.0, 0.0])))
print(np.array(out))
印刷:
[[[0.1 0.1]
[0.2 0.2]
[0.3 0.3]
[0. 0. ]
[0. 0. ]]
[[0.2 0.2]
[0.2 0.2]
[0.2 0.2]
[0.2 0.2]
[0.2 0.2]]
[[0.3 0.3]
[0.3 0.3]
[0.3 0.3]
[0.3 0.3]
[0. 0. ]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/467434.html
