Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
在使用numpy的python中,如何根据两个数组中存在的列从另一个数组更新数组?_Python_Arrays_Numpy - Fatal编程技术网

在使用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的数组时,问题仍然存在。。这个问题还没有解决