【问题标题】:Python numpy array operationsPython numpy 数组操作
【发布时间】:2018-11-30 11:17:52
【问题描述】:

我很难用 numpy 学习 Python 数组处理。

我有一个 .csv 文件,其中包含一列无符号整数数据,表示来自模拟数字转换器的二进制值。 我想在 jupyter notebook 中使用 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 数组有很大的误解。

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

谢谢你, 麦克

【问题讨论】:

  • “12 位二进制表示”究竟是什么意思?您是否希望输出为字符串,例如 23 -> '000000010111'?或者你想要一个像b'\x00\x17' 这样的bytes 字符串,在Big Endian 中是23。
  • 我需要一个字符串表示。我想, bin() 函数可能是我需要的工具。不幸的是,到目前为止,我的代码还没有做到这一点。当最初的问题解决后,也许会出现另一个问题。

标签: python arrays numpy


【解决方案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))

【讨论】:

  • PM 2Ring,由于我计划将来更多地使用 Python 和 Jupyter Notebook 技术,因此非常欢迎每条信息!所以谢谢你的解释和你的例子!非常感谢。
  • @Kiamur 当您在 decimalValues 数组上使用我的代码时,它是否会为您提供所需的输出?
  • 输出格式和我预期的一样,是的。没有前导 '0b' 的 12 位字符串。谢谢!
【解决方案2】:

在您的情况下导致错误的原因是您试图在切片上应用 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)

让我知道它是否有效!

【讨论】:

  • 博格丹,谢谢,这为我指明了正确的方向。但是,在我的情况下,“j”索引可以恒定为 0,因为我只有 1 列要处理。由于 bin() 函数的输出是一个字符串,我得到一个错误,它不能保存到 binaryValues 数组中。我很好,我将切换到 Python 列表并将输出附加到那里。最初的问题,如何处理我的错误信息得到了回答!
  • 由于您答案中的代码很可能会导致错误,我是否应该接受这个答案?
  • @Kiamur 好的,现在我明白你的意思了。如果它会导致错误,那么不要接受它作为答案,但如果它有帮助,你可以投票:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多