Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy索引数组插入_Python_Arrays_Numpy_Insert_Concatenation - Fatal编程技术网

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)