Почему numpy.int16 становится numpy.float64 после того, как я немного маскируюсь? - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь немного замаскировать и отбросить младший бит моих данных [], numpy.ndarray, содержащий int16.data = [2,0,4, ......, - 2, -4] Итак, я создаю новый массив и с помощью битовой маскировки с -2, который должен быть 1111111111111110 в терминах 16-битного двоичного файла.

data_new = np.zeros(len(data))
for i in range(len(data)):
    data_new[i] = np.int16(data[i] & -2) 

Почему-то вывод не является массивом int16.Это становится numpy.float64.И python не позволяет мне делать побитовое ИЛИ переписывать LSB.

TypeError: unsupported operand type(s) for |: 'numpy.float64' and 'int'
>>type(data[0])
numpy.int16
>>type(data_new[0])
numpy.float64

1 Ответ

2 голосов
/ 19 марта 2019

Массив dtype, возвращаемый numpy.zeros, по умолчанию равен float64. Если вам нужен другой тип, либо явно введите dtype, например ::

data_new = np.zeros(len(data), np.int16)

или, если data был уже правильного размера и dtype, используйте np.zeros_like, чтобы скопировать его формат и структуру:

data_new = np.zeros_like(data)

Имейте в виду, что в данном конкретном случае правильное решение, скорее всего, просто позволит numpy выполнять маскирование и создание нового массива неявным образом, заменив создание массива и цикл для заполнения его просто:

data_new = data & -2

, который будет работать намного быстрее и "просто работать" (он будет иметь тот же размер и dtype, что и data автоматически).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...