У меня есть некоторые трудные времена, изучая обработку массива Python с помощью numpy.
У меня есть CSV файл, который содержит в одном столбце беззнаковые целочисленные данные, которые представляют двоичные значения из аналогового цифрового преобразователя. Я хотел бы преобразовать эти значения без знака в 12-битное двоичное представление, используя Python внутри jupyter-ноутбука.
Я попробовал несколько способов его реализации, но я все равно не могу...
вот мой код:
import pandas as pd
df = pd.read_csv('my_adc_values.csv', delimiter ='\s+', header=None, usecols=[19])
decimalValues = df.values
print(decimalValues.shape)
пока что так хорошо... У меня есть все значения столбца данных adc в массиве numimal десятичных значений.
Теперь я хотел бы выполнить итерацию по массиву и преобразовать целые числа в массив в двоичное представление:
import numpy as np
# destination array of shape of source array
binaryValues = np.zeros(decimalValues.shape)
for i in range(len(decimalValues)):
print(decimalValues[i])
binaryValues[i]=(bin(decimalValues[i]))
print(binaryValues)
С помощью этого кода я получаю сообщение об ошибке
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-890444040b2e> in <module>()
6 for i in range(len(decimalValues)):
7 print(decimalValues[i])
----> 8 binaryValues[i]=(bin(decimalValues[i]))
9
10 print(binaryValues)
TypeError: only integer scalar arrays can be converted to a scalar index
Я пробовал несколько разных решений, но никто из них не работал. Кажется, что у меня массивное непонимание массивов numpy.
Я ищу отзыв о том, как решить мою описанную проблему. Я нашел несколько потоков, описывающих указанное сообщение об ошибке. Я подозревал, что это как-то связано с формой исходных/целевых массивов. поэтому я инициализировал массив назначения с той же формой, что и источник. Это не помогло...
Благодарю вас, Майк
Numpy - это, прежде всего, работа с числовыми данными, это не дает вам большой пользы, когда вы работаете со строками. Numpy может преобразовывать целые числа в десятичные или шестнадцатеричные строки, используя функцию numpy.char.mod
, которая использует старый оператор интерполяции %
строк. К сожалению, это не поддерживает двоичный вывод. Мы можем создать векторную функцию Numpy, которая использует стандартную функцию format
Python для преобразования. Это лучше, чем bin
, поскольку вы не получаете ведущего '0b'
, и вы можете указать минимальную длину.
import numpy as np
# Make some fake numeric data
nums = (1 << np.arange(1, 10)) - 1
print(nums)
# Convert to 12 bit binary strings
func = np.vectorize(lambda n: format(n, '012b'))
bins = func(nums)
print(bins)
выход
[ 1 3 7 15 31 63 127 255 511]
['000000000001' '000000000011' '000000000111' '000000001111' '000000011111'
'000000111111' '000001111111' '000011111111' '000111111111']
Кроме того, сделайте преобразование, используя простой Python. Вы можете преобразовать результат обратно в массив Numpy, если вам это действительно нужно. Этот код использует метод str.format
, а не функцию format
используемую предыдущей версией.
bins = list(map('{:012b}'.format, nums))
В результате возникает ошибка в том, что вы пытаетесь применить функцию bin на срезе, тогда как ее можно применять только к одному значению. Вам может понадобиться дополнительный цикл for для итерации значений столбцов. Попробуйте изменить свой код таким образом:
for i in range(len(decimalValues)):
for j in range(decimalValues.shape[1]):
print(decimalValues[i])
binaryValues[i, j]=(bin(decimalValues[i, j]))
print(binaryValues)
Дайте мне знать, если это сработает!
decimalValues
?