python - 修复将整数列表转换为 NumPy 矩阵的方法
问题描述
我想创建随机整数并通过 NumPy 矩阵将它们转换为二进制格式。我写了以下代码:
def toBinary(C):
l = []
for x in C:
b = [int(i) for i in bin(x)[2:]]
l = np.vstack((l, np.array(b)))
return l
list_vectors = [random.randint(0, 2 ** 64) for _ in range(2)]
print(toBinary(list_vectors))
但我仍然不知道如何解决这个错误:
Traceback (most recent call last):
File "test.py", line 31, in <module>
print(toBinary(list_vectors))
File "test.py", line 27, in toBinary
l = np.vstack((l, np.array(b)))
File "/anaconda3/lib/python3.6/site-packages/numpy/core/shape_base.py", line 234, in vstack
return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
ValueError: all the input array dimensions except for the concatenation axis must match exactly
任何建议都受到高度赞赏。
解决方案
这里的问题是转换为二进制并不总是返回相同长度的二进制数。如果 C 中的第一个整数是 3,那么它将给出 '0b11'。将其堆叠在数组中,然后尝试转换 17。糟糕,您尝试将 '11' 和 '1001' 连接在一起,它不起作用。
然后我在这里所做的是使用 format() 函数(转换为二进制并在 Python 中保持前导零)将转换后的二进制数长度强制为 10。
import numpy as np
import numpy.random as random
def toBinary(C):
binaries_length = 10
bin_format = f'#0{binaries_length+2}b'
array_rows = len(C)
l = np.empty((array_rows, binaries_length))
for i, x in enumerate(C):
l[i,:] = np.array([int(i) for i in format(x, bin_format)[2:]])
return l
list_vectors = [random.randint(0, 2 * 64) for _ in range(10)]
print(toBinary(list_vectors))
此外,返回的数组是预先分配的,因为您现在完全知道它的大小:
binaries_length = 10
bin_format = f'#0{10+2}b'
array_rows = len(C)
l = np.empty((array_rows, binaries_length))
顺便说一句,调用 random.randint(0, 2 ** 64) 也会触发异常,因为 2 ** 64 太高了,所以我在这里将其更改为 2*64。
更进一步,您可以通过找到 C 的最大值来找到最佳二进制长度。
推荐阅读
- cmake - CMakeLists:未找到 Z3Config.cmake
- c# - AKKA.NET 问题:在应用程序中拥有多个 ActorSystem 是个好主意吗?
- sql - SQL Server 2015 中的查询导致问题
- xaml - Xaml 路径说明
- android - 响应不是来自使用改造的服务器
- c - 逐部分获取 vsnprintf() 输出
- asciidoctor - 从 asciidoctor 激活植物
- ms-word - 在哪里取消隐藏隐藏的部分?
- regex - PostgreSQL 正则表达式不是那么不贪婪
- android - ExifInterface saveAttributes() 不将属性保存到 jpg 图像