我有一个给定的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
答案 0 :(得分:0)
将np.unique
与return_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 = 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)]])