Операции с массивами Python

1

У меня есть некоторые трудные времена, изучая обработку массива 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.

Я ищу отзыв о том, как решить мою описанную проблему. Я нашел несколько потоков, описывающих указанное сообщение об ошибке. Я подозревал, что это как-то связано с формой исходных/целевых массивов. поэтому я инициализировал массив назначения с той же формой, что и источник. Это не помогло...

Благодарю вас, Майк

Теги:
arrays
numpy

2 ответа

1
Лучший ответ

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))
  • 0
    PM 2Ring, так как я планирую использовать Python и технику Jupyter Notebook чаще в будущем, каждая часть информации очень приветствуется! Так что спасибо за ваше объяснение и ваш пример! Это очень ценится.
  • 0
    @Kiamur Дает ли мой код желаемый результат при его использовании в массиве decimalValues ?
Показать ещё 1 комментарий
1

В результате возникает ошибка в том, что вы пытаетесь применить функцию 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)

Дайте мне знать, если это сработает!

  • 0
    Богдан, спасибо, это направило меня в правильном направлении. В моем случае, однако, индекс 'j' может быть постоянным на 0, потому что у меня есть только 1 столбец для обработки. Поскольку выходные данные функции bin () представляют собой строку, я получаю сообщение об ошибке, что ее нельзя сохранить в массиве binaryValues. Я в порядке с этим, я просто переключусь на список Python и добавлю вывод там. На первоначальный вопрос, как обработать мое сообщение об ошибке, дан ответ!
  • 0
    Поскольку код в вашем ответе, скорее всего, приведет к ошибке, должен ли я в любом случае принять этот ответ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню