我有一个数值数组(从更大的数据集简化):
data =
array([[2, 1, 3, 4,]
[2, 1, 4, 5,]
[2, 1, 5, 6,]
[2, 1, 6, 7,]
[2, 1, 7, 8,]
[2, 1, 8, 9,]
[2, 1, 9, 10]])
我想把这些值变成
output =
np.array([[1.2, 0., 2.4, 3.6]
[1.2, 0., 3.6, 4.8]
[1.2, 0., 4.8, 6. ]
[1.2, 0., 6., 7.2]
[1.2, 0., 7.2, 8.4]
[1.2, 0., 8.4, 9. ]
[1.2, 0., 9., 9.6]])
我有一个打算使用的查找数组,但无法弄清楚如何使用它:
lookup =
array([[ 1. , 0. ]
[ 2. , 1.2]
[ 3. , 2.4]
[ 4. , 3.6]
[ 5. , 4.8]
[ 6. , 6. ]
[ 7. , 7.2]
[ 8. , 8.4]
[ 9. , 9. ]
[ 10., 9.6]])
我无法找到一种使用numpy数组执行此操作的方法,因此我将数据转换为Pandas数据框:
df = pd.DataFrame(data[:, :], columns=('A', 'B', 'M', 'N'))
df
Out[125]:
A B M N
0 2 1 3 4
1 2 1 4 5
2 2 1 5 6
3 2 1 6 7
4 2 1 7 8
5 2 1 8 9
6 2 1 9 10
并尝试使用字典转换值:
di = {1: 0., 2: 1.2, 3: 2.4, 4: 3.6, 5: 4.8, 6: 6., 7: 7.2, 8: 8.4, 9: 9., 10: 9.6}
df.replace({'A': di})
Traceback (most recent call last):
File "<ipython-input-124-6a329a5fa829>", line 1, in <module>
df.replace({'A': di})
File "C:\Users\russells\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py", line 4521, in replace
raise ValueError("Replacement not allowed with "
ValueError: Replacement not allowed with overlapping keys and values
这显然行不通,但似乎是解决问题的一种非常笨拙,可怕的方式。必须有一种查找查找数组而不是编写字典的方法。有人有指针吗?
答案 0 :(得分:1)
您需要使用numpy.vectorize才能直接映射值。
def mapper(x):
return lookup[lookup[:,0]==x][:,1][0]
v = np.vectorize(mapper)
data = v(data.astype(float))
输出:
array([[ 1.2, 0. , 2.4, 3.6],
[ 1.2, 0. , 3.6, 4.8],
[ 1.2, 0. , 4.8, 6. ],
[ 1.2, 0. , 6. , 7.2],
[ 1.2, 0. , 7.2, 8.4],
[ 1.2, 0. , 8.4, 9. ],
[ 1.2, 0. , 9. , 9.6]])
答案 1 :(得分:-1)
您可以不同地考虑您的问题。就像数组data
包含到数组lookup
的索引一样,只是它从1开始。然后只需要对其进行索引:
import numpy as np
# Orignial data
data = np.array([
[2, 1, 3, 4, ],
[2, 1, 4, 5, ],
[2, 1, 5, 6, ],
[2, 1, 6, 7, ],
[2, 1, 7, 8, ],
[2, 1, 8, 9, ],
[2, 1, 9, 10]])
lookup = np.array([
[1., 0.],
[2., 1.2],
[3., 2.4],
[4., 3.6],
[5., 4.8],
[6., 6.],
[7., 7.2],
[8., 8.4],
[9., 9.],
[10., 9.6]])
# Create a 1-based lookup array from the second column
lookup2 = np.zeros(lookup.shape[0] + 1)
lookup2[1:] = lookup[:, 1]
# Index the lookup array
output = lookup2[data]
print(output)
也许您可以修改代码以直接创建lookup2
数组,但这取决于如何获取数据。