【问题标题】:Efficient manipulations of binary matrix in numpynumpy中二进制矩阵的有效操作
【发布时间】:2012-07-27 05:36:29
【问题描述】:

对于二进制矩阵,我的意思是矩阵中的每个元素都是 0 或 1,为此我使用 numpy 中的 Matrix 类。

首先,在 numpy 中是否有特定类型的矩阵用于它,还是我们只是使用一个填充了 0 和 1 的矩阵?

其次,在给定 Matrix 类的维度的情况下,创建一个 全为 0 的方阵最快方法是什么?注意:numpy.zeros((dim, dim)) 不是我想要的,因为它创建了一个带有浮点数的二维数组 0.

第三,我想频繁地获取和设置矩阵的任何给定行。对于get,我可以考虑使用row = my_matrix.A[row_index].tolist(),它将返回给定行的列表表示。对于设置,似乎我可以做my_matrix[row_index] = row_listrow_list 是一个与给定行长度相同的列表。同样,我想知道它们是否是最有效的工作方法。

【问题讨论】:

  • 为什么需要numpy.matrix 而不是numpy.ndarray?为什么在检索行时将它们转换为列表?
  • @SvenMarnach,我需要一个矩阵,因为它具有用于矩阵特定计算的现成函数。我在检索时将一行转换为列表,因为我需要将其序列化为 JSON。
  • 许多这些特定于矩阵的操作也可以应用于数组——这就是我被问到的原因。如果您需要将事物序列化为 JSON,那么您的瓶颈很可能在其他地方,您无需关心从矩阵中检索一行的速度。

标签: python matrix numpy


【解决方案1】:

要创建一个元素可以是 0 或 1 的 numpy 数组,请使用 dtype = 'bool' 参数:

arr = np.zeros((dim,dim), dtype = 'bool')

或者,将arr 转换为 numpy 矩阵:

arr = np.matrix(arr)

访问一行:

arr[row_num]

并设置一行:

arr[row_num] = new_row

是最快的方法。

【讨论】:

  • 感谢您的建议。我希望矩阵中的元素为01,而不是TureFalse。此外,arr[row_num] 将返回一维矩阵对象,而不是数组或列表。
  • TrueFalse01 基本相同——只需在交互式解释器中尝试这些表达式:0 == False3 * True
  • @SvenMarnach 它们是相同的,但TrueFalse 占用8 位,01(在Python 中)也是如此。拥有其条目是实际位的 numpy 数组会很好......
  • @étale-cohomology arr = np.zeros((dim,dim), dtype=int)
猜你喜欢
  • 2014-08-17
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
相关资源
最近更新 更多