我很难用numpy学习Python数组处理。
我有一个.csv文件,该文件在一列中包含无符号整数数据,该整数数据表示来自模拟数字转换器的二进制值。 我想在jupyter笔记本中使用Python将这个无符号整数值转换为12位二进制表示形式。
我尝试了几种实现它的方法,但仍然失败了...
这是我的代码:
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数据列值都保存在decimalValues numpy数组中。
现在,我想遍历数组并将数组中的整数转换为二进制表示形式:
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数组有很大的误解。
我正在寻找有关如何解决上述问题的提示。我找到了一些线程,描述了提到的错误消息。我怀疑,这与源/目标阵列的形状有关。因此,我以与源相同的形状初始化了目标数组。它没有帮助...
谢谢你, 迈克
答案 0 :(得分: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)
让我知道它是否有效!
答案 1 :(得分:1)
Numpy主要用于处理数字数据,在处理字符串时不会给您带来太大的好处。 Numpy 可以使用numpy.char.mod
函数将整数转换为十进制或十六进制字符串,该函数利用了旧的%
string interpolation运算符。不幸的是,这不支持二进制输出。我们可以创建一个使用标准Python format
函数进行转换的Numpy向量化函数。这比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))