Python 从一个阵列映射到另一个阵列的最快方法?

Python 从一个阵列映射到另一个阵列的最快方法?,python,arrays,numpy,Python,Arrays,Numpy,我尝试将值从一个数组映射到另一个大小不同的数组,使用第三个数组提供索引。我已经使用for循环成功地实现了这一点,但我希望使用Numpy找到一种更快的方法。到目前为止,我一直在努力寻找任何可行的方法。我能找到的最接近的东西是numpy.put()函数,但由于我正在从一个大数组映射到一个小数组,因此会有许多具有相同索引的值。我想对这些值求和(+=在索引处),但numpy.put函数只是覆盖指定索引处的值 下面是我尝试做的一个例子: # Create the arrays for this examp

我尝试将值从一个数组映射到另一个大小不同的数组,使用第三个数组提供索引。我已经使用for循环成功地实现了这一点,但我希望使用Numpy找到一种更快的方法。到目前为止,我一直在努力寻找任何可行的方法。我能找到的最接近的东西是numpy.put()函数,但由于我正在从一个大数组映射到一个小数组,因此会有许多具有相同索引的值。我想对这些值求和(+=在索引处),但numpy.put函数只是覆盖指定索引处的值

下面是我尝试做的一个例子:

# Create the arrays for this example
import numpy as np

lattice1 = np.zeros(20)
lattice2 = np.zeros(20)

index = [0,4,7,8,9]*40

data = np.array(range(200))

# Make a for-loop to move the data onto the correct position of the lattice
counter=0
for item in data:
    lattice1[index[counter]]+=item
    counter+=1

# Trying to find a faster implementation using Numpy
np.put(lattice2,index,data)
以及输出(为便于查看,上述代码中排除了打印语句):

格子1:

[0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0。 0 0.0。]

索引:

[0,4,7,8,9,0,4,7,8,9,0,4,7,8,9,0,4,7,8,9,0,0,4,7,8,9,0,4,7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9, 0, 4, 7, 8, 9,0,4,7,8,9,0,4,7,8,9,0,4,7,8,9]

数据:

[01 2 3 4 6 7 8 9 10 11 12 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199]

for循环在正确的晶格上累积具有相同索引的数据 要点:

[3900.0.0.0.3940.0.0.3980。 4020. 4060. 0.0.0.0.0.0.0.0.0.0.0.]

numpy.put的输出覆盖了具有相同索引的值:

[195.0.0.0.196.0.0.197.198.199.0。 0.0.0.0.0.0.0.0.0.0.]

我的动机是加速这个过程,因为这个for循环比我的其余代码(我可以使用Numpy)慢得多。我正在操作的阵列大约有6000000个元素,我必须在数百个阵列上运行它。因此,速度稍微提高(5倍?)就足以证明这一努力的合理性


也许我选择了错误的解决方案,有更好的解决方法,如果其他方法都失败了,我可以继续使用for循环。尽管如此,任何见解都将不胜感激

IIUC,我认为这是对numpy的大量类似“groupby”的问题的重复(参见bincount和ufunc.at)。在您的例子中,您可以尝试
np.add.at(lattice2,index,data)
(请参阅)。如果这是您想要的,我们可以作为dup关闭。@DSM
np.add.at(lattice2,index,data)
似乎正是OP需要的。它给出了与
lattice1
相同的结果。你心里有没有一个特别的问题,这个问题是重复的?@DSM是的,就是这样!谢谢如果问题是重复的,我将关闭它…我仍然足够新,我想我没有搜索正确的关键字。