首先,我知道有一种使用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进行此操作的简单,快速且有效的方法?
答案 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]])
在这里,对于索引i
,b[i] = 17 - i
,我们看到此映射是在计算b[a]
时执行的。
如果arr1
包含的值不是有效索引,则从逻辑上讲,这将在IndexError
中产生。