Python Numpy索引数组插入
我有两个阵列,在最后一个轴上具有相同的形状,即: 第一:Python Numpy索引数组插入,python,arrays,numpy,insert,concatenation,Python,Arrays,Numpy,Insert,Concatenation,我有两个阵列,在最后一个轴上具有相同的形状,即: 第一: [[6614, 3390, 6327, 7595, 2797], [4604, 3392, 4128, 1835, 7397], [2268, 367, 7595, 2268, 2546], [5450, 5450, 2836, 5450, 4106], [8846, 8846, 3666, 8846, 3098], [ -1, -1, 5450, -1, 5450], [ -1,
[[6614, 3390, 6327, 7595, 2797],
[4604, 3392, 4128, 1835, 7397],
[2268, 367, 7595, 2268, 2546],
[5450, 5450, 2836, 5450, 4106],
[8846, 8846, 3666, 8846, 3098],
[ -1, -1, 5450, -1, 5450],
[ -1, -1, 8846, -1, 8846],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]]
第二:
[[4035, 4035, 4035, 1168, 3545],
[8846, 8846, 8846, 8846, 8846],
[ -1, -1, -1, 8846, -1]]
假设形状是(10,5)和(3,5)。我想做的是沿第一个轴将第二个数组插入第一个数组中,但要使第一个数组的每一行都与第二个数组相连,即:(我已表示第二个数组的元素)
np.insert似乎不接受在特定索引处设置序列,所以我需要一些可以接受范围的设置。这显然可以通过for循环解决,但我认为有一个更简单的解决方案。如果您不介意转换为pandas数据帧,这里有一个简单的解决方案:
# Convert arrays to DataFrames
df1 = pd.DataFrame(first)
df2 = pd.DataFrame(second)
# Concatenate the first and second DataFrames
df = pd.concat([df1.replace([-1, 0], np.nan), df2])
df = df.apply(lambda x: pd.Series(x.dropna().values)).fillna(0).astype('int')
# Convert back to numpy array
df = df.as_matrix()
print(df)
[[6614 3390 6327 7595 2797]
[4604 3392 4128 1835 7397]
[2268 367 7595 2268 2546]
[5450 5450 2836 5450 4106]
[8846 8846 3666 8846 3098]
[4035 4035 5450 1168 5450]
[8846 8846 8846 8846 8846]
[ -1 -1 4035 8846 3545]
[ 0 0 8846 0 8846]
[ 0 0 -1 0 -1]]
也许有一种更有效的方法可以做到这一点,但现在开始 如果先转置矩阵,则问题更容易理解:
[[6614 4604 2268 5450 8846 -1 -1 0 0 0]
[3390 3392 367 5450 8846 -1 -1 0 0 0]
[6327 4128 7595 2836 3666 5450 8846 0 0 0]
[7595 1835 2268 5450 8846 -1 -1 0 0 0]
[2797 7397 2546 4106 3098 5450 8846 0 0 0]]
[[4035 8846 -1]
[4035 8846 -1]
[4035 8846 -1]
[1168 8846 8846]
[3545 8846 -1]]
然后只需在右侧偏移处写入第二行:
import numpy as np
a = np.array([[6614, 3390, 6327, 7595, 2797],
[4604, 3392, 4128, 1835, 7397],
[2268, 367, 7595, 2268, 2546],
[5450, 5450, 2836, 5450, 4106],
[8846, 8846, 3666, 8846, 3098],
[ -1, -1, 5450, -1, 5450],
[ -1, -1, 8846, -1, 8846],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]])
b = np.array([[4035, 4035, 4035, 1168, 3545],
[8846, 8846, 8846, 8846, 8846],
[ -1, -1, -1, 8846, -1]])
a2 = a.T
b2 = b.T
n = len(b2[0])
for i, offset in enumerate([5, 5, 7, 5, 7]):
a2[i,offset:offset+n] = b2[i]
print(a2.T)
它输出:
[[6614 3390 6327 7595 2797]
[4604 3392 4128 1835 7397]
[2268 367 7595 2268 2546]
[5450 5450 2836 5450 4106]
[8846 8846 3666 8846 3098]
[4035 4035 5450 1168 5450]
[8846 8846 8846 8846 8846]
[ -1 -1 4035 8846 3545]
[ 0 0 8846 0 8846]
[ 0 0 -1 0 -1]]
您还可以避免前后换位:
import numpy as np
a = np.array([[6614, 3390, 6327, 7595, 2797],
[4604, 3392, 4128, 1835, 7397],
[2268, 367, 7595, 2268, 2546],
[5450, 5450, 2836, 5450, 4106],
[8846, 8846, 3666, 8846, 3098],
[ -1, -1, 5450, -1, 5450],
[ -1, -1, 8846, -1, 8846],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]])
b = np.array([[4035, 4035, 4035, 1168, 3545],
[8846, 8846, 8846, 8846, 8846],
[ -1, -1, -1, 8846, -1]])
n = b.shape[0]
for i, offset in enumerate([5, 5, 7, 5, 7]):
a[offset:offset+n, i] = b[:,i]
print(a)
因此,您没有使用
[5,5,7,5,7]
中的所有索引,因为第二个数组只有三行?我使用的是所有索引,注意有5列和5个索引。我不理解您的示例。[0,0,-1,0,-1]
来自哪里?请查看我的更正结果(只有-1关闭)。下面是如何生成结果的,逐列获取第二个数组并将其滑入第一个数组,将其定位在索引列表中指定的索引处([5,5,7,5,7])。因此,第二个数组的第一列将插入到第五个索引处的第一列中。我已经突出显示了第二个数组在第一个数组中的位置。Concatenate将只在第一个数组的末尾附加第二个数组,考虑到每列的长度不同,它不会进行插入。请看我的第一个问题中提到的第三个数组,这是我正在寻找的结果。它是连接
,而不是连接
。但这并不是OP想要的。我今天早上在手机上这么做了,并且误解了这个问题。我已经用一个满足问题的版本更新了它。比我的解决方案快。谢谢是的,这就是我目前正在使用的。我很好奇numpy是否有一个操作符知道如何直接插入它,而不需要for循环。如果没有人回答,我最终会接受你的回答,谢谢。如果你正在使用某个东西,请在你的问题中写下它。这使我们更容易理解问题所在。
[[6614 3390 6327 7595 2797]
[4604 3392 4128 1835 7397]
[2268 367 7595 2268 2546]
[5450 5450 2836 5450 4106]
[8846 8846 3666 8846 3098]
[4035 4035 5450 1168 5450]
[8846 8846 8846 8846 8846]
[ -1 -1 4035 8846 3545]
[ 0 0 8846 0 8846]
[ 0 0 -1 0 -1]]
import numpy as np
a = np.array([[6614, 3390, 6327, 7595, 2797],
[4604, 3392, 4128, 1835, 7397],
[2268, 367, 7595, 2268, 2546],
[5450, 5450, 2836, 5450, 4106],
[8846, 8846, 3666, 8846, 3098],
[ -1, -1, 5450, -1, 5450],
[ -1, -1, 8846, -1, 8846],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]])
b = np.array([[4035, 4035, 4035, 1168, 3545],
[8846, 8846, 8846, 8846, 8846],
[ -1, -1, -1, 8846, -1]])
n = b.shape[0]
for i, offset in enumerate([5, 5, 7, 5, 7]):
a[offset:offset+n, i] = b[:,i]
print(a)