在使用numpy的python中,如何根据两个数组中存在的列从另一个数组更新数组?
所以我有一个如下的源数组:在使用numpy的python中,如何根据两个数组中存在的列从另一个数组更新数组?,python,arrays,numpy,Python,Arrays,Numpy,所以我有一个如下的源数组: [[ 9 85 32 100] [ 7 80 30 100] [ 2 90 16 100] [ 6 120 22 100] [ 5 105 17 100] [ 0 100 33 100] [ 3 110 22 100] [ 4 80 22 100] [ 8 115 19 100] [ 1 95 28 100]] 我想用这个来更新数组,取决于第一列 [[ 3 110 22 105] [ 5
[[ 9 85 32 100]
[ 7 80 30 100]
[ 2 90 16 100]
[ 6 120 22 100]
[ 5 105 17 100]
[ 0 100 33 100]
[ 3 110 22 100]
[ 4 80 22 100]
[ 8 115 19 100]
[ 1 95 28 100]]
我想用这个来更新数组,取决于第一列
[[ 3 110 22 105]
[ 5 105 17 110]
[ 1 95 28 115]]
像这样
[[ 9 85 32 100]
[ 7 80 30 100]
[ 2 90 16 100]
[ 6 120 22 100]
[ 5 105 17 110]
[ 0 100 33 100]
[ 3 110 22 105]
[ 4 80 22 100]
[ 8 115 19 100]
[ 1 95 28 115]]
但是我在NumPy中找不到一个函数可以直接实现这一点,所以目前没有比我写的这个方法更好的方法了:
def update_ary_with_ary(source, updates):
for x in updates:
index_of_col = np.argwhere(source[:,0] == x[0])
source[index_of_col] = x
这个函数会产生一个循环,所以它不专业,性能也不高,所以我会一直使用这个函数,直到有人给我一个更好的方法来处理NumPy圈,我不想从另一圈得到解决方案,只要NumPy假设您的源数组是
s
,更新数组是u
,假设s
和u
不是很大,您可以:
update_row_ids = np.nonzero(s[:,0] == u[:,0].reshape(-1,1))[1]
s[update_row_ids] = u
测试:
import numpy as np
s = np.array(
[[ 9, 85, 32, 100],
[ 7, 80, 30, 100],
[ 2, 90, 16, 100],
[ 6, 120, 22, 100],
[ 5, 105, 17, 100],
[ 0, 100, 33, 100],
[ 3, 110, 22, 100],
[ 4, 80, 22, 100],
[ 8, 115, 19, 100],
[ 1, 95, 28, 100]])
u = np.array(
[[ 3, 110, 22, 105],
[ 5, 105, 17, 110],
[ 1, 95, 28, 115]])
update_row_ids = np.nonzero(s[:,0] == u[:,0].reshape(-1,1))[1]
s[update_row_ids] = u
print(s)
这张照片是:
[[ 9 85 32 100]
[ 7 80 30 100]
[ 2 90 16 100]
[ 6 120 22 100]
[ 5 105 17 110]
[ 0 100 33 100]
[ 3 110 22 105]
[ 4 80 22 100]
[ 8 115 19 100]
[ 1 95 28 115]]
编辑:
OP提供了以下附加细节:
- “源阵列”是“巨大的”
- “更新数组”中的每一行都匹配 “源数组”中只有一行
sorted_idx = np.argsort(s[:,0])
pos = np.searchsorted(s[:,0],u[:,0],sorter=sorted_idx)
update_row_ids = sorted_idx[pos]
s[update_row_ids] = u
fountainhead你的答案正确,是的,它已经被充分利用了Numpy圈,但是在性能测试中,在我的模拟程序中处理50K行的时间增加了一倍!!从22秒到44秒!!我不知道为什么!!但是你的回答只帮助我在这一行上得到正确的答案:
source[updates[:,0]] = updates
# or
s[u[:,0]] = u
因此,当我使用它时,它的处理时间从100K行减少到只有0.5秒,然后让我用5秒的时间处理更像1M行,我已经在学习python和数据挖掘了。我对这些数字感到震惊,我以前在使用大型数组(如正则变量)的其他语言上从未遇到过这种情况。你可以在我的GitHub上看到
喷泉你应该接受答案,但你应该知道最好的答案。我再次检查。您的
s[u[:,0]]=u
解决方案将不会产生您要求的结果。因此,要么你的问题是错误的,要么你的s[u[:,0]]=u
的解是错误的。至于速度,你的问题没有提到涉及的尺寸。我做了一些假设(我确实提到过,尽管是非定量的)。如果您仍在寻找一些答案,或者对您的速度观察结果进行一些解释,我认为您应该提供更多有关所涉及大小的详细信息。您的权利,在我的代码中,源数组和列(0)的顺序是相同的,因此它对我适用,因此,在我们得到性能更高的答案之前,您的答案是正确的。关于您的应用程序/数据还有一个问题-u
的每一行是否恰好匹配一行s
,或者它是否可能匹配(并更新)多行s
?而s
和u
的潜在(最坏情况)长度是多少?在我的情况下,不应该是它在(s)和(u)中由col(0)表示的唯一行,目前s[u[:,0]]=u工作正常,并且(s)中的行已排序,但当我需要将数组更新为依赖于这两个col的数组时,问题仍然存在。。这个问题还没有解决