如何使用另一个数组更改数组的内容?

时间:2018-11-03 10:01:11

标签: python arrays numpy

首先,我知道有一种使用for循环的简单方法,但这是一个计算,需要每秒进行很多次,而python中的for循环效率太低去做这个。所以我正在寻找numpy的东西可以解决这个问题。

我有一个2D数组(arr1),其值介于0到256之间,以及一个1D数组(arr2),其大小为256,并包含该2D数组中数字出现的频率信息。因此,举例来说,如果arr1 [0,0] = 1且arr1 [0,1] = 1且只有那些值为1,则arr2 [1] = 2,因为值1在arr1中存在两次。 / p>

我现在想做的是将那个频率编号映射到arr1上,因此在先前的示例中arr1 [0,0]和arr1 [0,1]都将变为2,因为这是它们先前值的频率

简而言之,它看起来像这样,但是显然这不能仅仅在for循环之外工作:

arr1[i,j] = arr2[arr1[i,j]]

是否有使用numpy进行此操作的简单,快速且有效的方法?

1 个答案:

答案 0 :(得分:1)

鉴于arr2是一维数组,您可以将其编写为:

arr1 = arr2[arr1]

因此,我们在这里进行元素“映射”,其中新的arr1[i, j]是与为旧值arr2存储的arr1[i, j]的索引值相对应的值。 / p>

例如:

>>> a
array([[ 3, 15,  3, 15,  5],
       [ 8, 17, 14, 10,  1],
       [ 3,  8,  9,  0,  1],
       [10,  3, 10,  9,  1]])
>>> b
array([17, 16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,
        0])
>>> b[a]
array([[14,  2, 14,  2, 12],
       [ 9,  0,  3,  7, 16],
       [14,  9,  8, 17, 16],
       [ 7, 14,  7,  8, 16]])

在这里,对于索引ib[i] = 17 - i,我们看到此映射是在计算b[a]时执行的。

如果arr1包含的值不是有效索引,则从逻辑上讲,这将在IndexError中产生。