Добавить строковый столбец в плавающую матрицу NumPy - PullRequest
0 голосов
/ 13 ноября 2018

Я ищу метод для добавления столбца значений с плавающей запятой в матрицу строковых значений.

Mymatrix = 
[["a","b"],
 ["c","d"]]

Мне нужна такая матрица =

[["a","b",0.4],
 ["c","d",0.6]]

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Вы должны понять, почему вы это делаете. Numpy эффективен, потому что данные выровнены в памяти. Таким образом, смешивание типов обычно является источником плохой производительности. но в вашем случае вы можете сохранить выравнивание, так как все ваши строки имеют одинаковую длину. поскольку типы не являются однородными, вы можете использовать структурированный массив :

raw=[["a","b",0.4],
["c","d",0.6]]

dt=dtype([('col0','U1'),('col1','U1'),('col2',float)])

aligned=ndarray(len(raw),dt)

for i in range (len(raw)):
    for j in range (len(dt)):
        aligned[i][j]=raw[i][j]

Вы также можете использовать панд, но часто теряете некоторую производительность.

0 голосов
/ 13 ноября 2018

Как уже отмечалось, вы не можете смешивать типы данных в ndarray, но можете делать это в структурированном или массиве записей . Они похожи в том, что вы можете смешивать типы данных, как определено аргументом dtype= (он определяет типы данных и имена полей). Массивы записей предоставляют доступ к полям структурированных массивов по атрибуту, а не только по индексу. Вам не нужны циклы for, когда вы хотите скопировать все содержимое между массивами. Смотрите мой пример ниже (используя ваши данные):

Mymatrix = np.array([["a","b"], ["c","d"]])
Mycol = np.array([0.4, 0.6])

dt=np.dtype([('col0','U1'),('col1','U1'),('col2',float)])
new_recarr = np.empty((2,), dtype=dt)
new_recarr['col0'] = Mymatrix[:,0]
new_recarr['col1'] = Mymatrix[:,1]
new_recarr['col2'] = Mycol[:]
print (new_recarr)

Результирующий вывод выглядит так:

[('a', 'b',  0.4) ('c', 'd',  0.6)]

Оттуда используйте форматированные строки для печати. ​​
Вы также можете скопировать из recarray в ndarray, если вы измените порядок присваивания в моем примере.
Примечание: я обнаружил, что может быть значительное снижение производительности при использовании обработчиков. Смотрите ответ в этой теме:
ndarray быстрее, чем доступ к повторному массиву?

0 голосов
/ 13 ноября 2018

Я бы предложил использовать вместо pandas DataFrame:

import pandas as pd

df = pd.DataFrame([["a","b",0.4],
                   ["c","d",0.6]])

print(df)

   0  1    2
0  a  b  0.4
1  c  d  0.6

Вы также можете указать имена столбцов (Series):

df = pd.DataFrame([["a","b",0.4],
                   ["c","d",0.6]], columns=['A', 'B', 'C'])
df
   A  B    C
0  a  b  0.4
1  c  d  0.6
...