Python numpy数组操作

时间:2018-06-21 07:52:17

标签: python arrays numpy

我很难用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数组有很大的误解。

我正在寻找有关如何解决上述问题的提示。我找到了一些线程,描述了提到的错误消息。我怀疑,这与源/目标阵列的形状有关。因此,我以与源相同的形状初始化了目标数组。它没有帮助...

谢谢你, 迈克

2 个答案:

答案 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))