更改数组的值

时间:2018-12-10 18:41:55

标签: python arrays numpy

我有一个给定的numpy数组,数据。 我想将其值从0升序更改。 我可以通过手动制作查找表LUT来解决。

import numpy as np

data = np.array([[2, 6, 16, 39, 43],
                        [43, 6, 16, 39, 2]])


LUT={2:0,
    6:1,
    16:2,
    39:3,
    43:4} 

def changer(X):   
    res = np.copy(X)    
    for i, j in LUT.items():
        res[X==i] = j
    return res       

result = changer(data)
print (result)

[[0 1 2 3 4]
 [4 1 2 3 0]]

结果符合我的预期。 但是,有时候,我懒于手动制作LUT。 那么,如何以编程方式获得相同的结果?

编辑

我试图制作字典,如下所示。

list = [2,6,16,39,43]

LUT = {}
for i in enumerate(list):
    LUT.update({list[i]: i})

But, 

D.update({list[i]: i})
TypeError: list indices must be integers, not tuple

4 个答案:

答案 0 :(得分:0)

np.uniquereturn_inverse标志一起使用:

data = np.array([[2, 6, 16, 39, 43],
                 [43, 6, 16, 39, 2]])

unq, ranked = np.unique(data, return_inverse=True)

unique没有设置axis会展平,所以我们需要重塑

ranked = ranked.reshape(data.shape)
ranked
# array([[0, 1, 2, 3, 4],
#        [4, 1, 2, 3, 0]])

答案 1 :(得分:0)

如果我了解您的需求,则应该根据您的数据自动生成np_lu。

In [24]: np_lu=sorted(set(data.ravel()))
In [25]: np_lu
Out[25]: [2, 6, 16, 39, 43]

创建一个索引数组2-> 0,6-> 1,... 43-> 4

In [29]: indx=np.array(np_lu)
In [33]: d=np.zeros(indx.max()+1)
In [34]: d[indx]=np.arange(len(indx))
In [35]: d
Out[35]:
array([ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,
    0.,  0.,  0.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
    0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
    3.,  0.,  0.,  0.,  4.])

In [36]: data
Out[36]:
array([[ 2,  6, 16, 39, 43],
       [43,  6, 16, 39,  2]])

创建结果数组,res。

In [37]: res=np.zeros_like(data)

用d中的数据填充res,并按数据索引。

In [41]: res=d[data]
In [42]: res
Out[42]:
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 4.,  1.,  2.,  3.,  0.]])

这仅适用于int类型的数据。在我的代码中可能有很多可以整理的东西。

答案 2 :(得分:0)

我认为这确实是np.argsort

  

返回将对数组进行排序的索引。

import numpy as np
data = np.array([[2, 6, 16, 39, 43],
                        [43, 6, 16, 39, 2]])
data.argsort(1).tolist()

输出:

[[0, 1, 2, 3, 4], [4, 1, 2, 3, 0]]

然后倒退给出索引的一维数组,l和二维数组iarr:

l = np.array([2, 6, 16, 39, 43])
iarr = np.array([[0, 1, 2, 3, 4], [4, 1, 2, 3, 0]])

我们可以使用广播

l[iarr]

输出:

array([[ 2,  6, 16, 39, 43],
       [43,  6, 16, 39,  2]])

答案 3 :(得分:-1)

如果我满足您的需求,那么您所需要的就是:

import numpy as np
lst = np.array([[i for i in range(len(data[0]))],[i for i in range(len(data[1])-1,-1,-1)]])