Использование маски для замены строки в массиве numpy приводит к усеченной строке - PullRequest
1 голос
/ 08 января 2020

В гораздо большем проекте я использую маску, чтобы установить цвета для графика на основе ряда других входных данных. В одном наборе по умолчанию используется цвет 'darkgreen', если только маска не равна True, тогда он превращается в 'white'. Во втором сете верно обратное. Приведенный ниже код является MRE, который включает только настроенную маску / массив.

Секция, которая превращает 'darkgreen' в 'white', работает нормально. Но когда я пытаюсь повернуть 'white' до 'darkgreen', он усекает его до 'darkg'. Я предполагаю, что он работает с тем же количеством символов в строке, но я не уверен, почему или как это исправить! Заранее спасибо.

import numpy as np
import pandas as pd

df=pd.DataFrame(np.random.randn(30, 2), columns=['A','B'])

a_mask = df['A'] > 0
b_mask = df['B'] > 0

n = 30

uca = ['darkgreen' for i in range(n)]
uca = np.array(uca)
uc = uca.copy()
uc[a_mask] = 'white'
dca = ['white' for i in range(n)]
dca = np.array(dca)
dc = dca.copy()
dc[b_mask] = 'darkgreen'
print(uc)
print(dc)

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Проверьте dtype ваших массивов строк:

>>> uca.dtype
dtype('<U9')

>>> dca.dtype
dtype('<U5')

Первый dtype - это 9-символьная строка Unicode (< обозначает порядок байтов (little-endian)), тогда как второй - 5 строка символов. Вот почему происходит усечение - массив dca может содержать строки длиной до 5 символов. Таким образом, один из способов решить эту проблему - заменить dca = np.array(dca)) в вашем коде на dca = np.array(dca, dtype=uca.dtype) для соответствия dtypes. Или вы можете использовать dtype = object для обоих массивов, чтобы они могли хранить строки произвольной длины.

0 голосов
/ 08 января 2020

Вам необходимо использовать функцию numpy where:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(30, 2), columns=['A', 'B'])

a_mask = df['A'] > 0
b_mask = df['B'] > 0

n = 30

uca = ['darkgreen' for i in range(n)]
uca = np.array(uca)
uc = uca.copy()
uc[a_mask] = 'white'
dca = ['white' for i in range(n)]
dca = np.array(dca)
dc = dca.copy()
dc = np.where(b_mask, 'darkgreen', dc)
print(uc)
print(dc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...