Замена значений в массиве или кадре данных - PullRequest
0 голосов
/ 27 июня 2018

У меня есть массив значений (упрощенный из гораздо большего набора данных):

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

Это, очевидно, не сработало, но также кажется действительно неуклюжим, ужасным способом решения проблемы. Должен быть способ поиска массива поиска, а не написание словаря. У кого-нибудь есть указатели?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете рассмотреть свою проблему по-другому. Как будто массив 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, но это зависит от того, как вы получаете свои данные.

0 голосов
/ 27 июня 2018

Вам необходимо использовать 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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...