【问题标题】:np.meshgrid throws DeprecationWarning or MemoryError for large inputsnp.meshgrid 为大输入抛出 DeprecationWarning 或 MemoryError
【发布时间】:2021-05-06 10:04:52
【问题描述】:

对于聚类问题,我正在尝试创建理想的相似度矩阵。也就是说,我有一个簇标签的一维数组,需要创建一个条目为 1 的二维二进制或布尔矩阵,如果两个数据点属于同一个簇。

为此,我使用np.meshgrid,但它仅适用于较小的示例。这是一个 MWE:

使用大小为 5 的数组,它可以按需要工作:

arr = np.random.randint(0, 10, size=5)
print(arr)
mesh_grid = np.meshgrid(arr, arr, sparse=True)
mesh_grid[0] == mesh_grid[1]

给予

[9 0 9 0 7]
array([[ True, False, False, False, False],
       [False,  True, False, False, False],
       [False, False,  True, False, False],
       [False, False, False,  True, False],
       [False, False, False, False,  True]])

但是,对于大小为 60000 的数组,它不起作用:

arr = np.random.randint(0, 10, size=60000)
mesh_grid = np.meshgrid(arr, arr, sparse=True)
mesh_grid[0] == mesh_grid[1]

给予

DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
  mesh_grid[0] == mesh_grid[1]

设置sparse=False 会引发内存错误。基于this answer,我认为DeprecationWarning也一定是由于内存造成的。

问题:我该如何解决这个问题,或者是否有其他更有效的方法来获得所需的矩阵?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    例如,如果您的数组仅由 10 个不同的元素 (0,1,2,3....) 组成,那么您只需将数组与这 10 个元素进行比较,而不是与整个矩阵进行比较。

    所以可以进行如下操作:

    # Number of different elements
    n = 3
    # Generate the random vector (2D)
    arr = np.random.randint(0, n, size=10)[None,:]
    # Create the vector containing all the different elements (2D)
    num = np.r_[0:n][:,None]
    # We broadcast the 2 vectors to obtain a n*10 matrix
    uni = arr==num
    # Based on the previous result, we duplicate the row that need to be duplicated:
    res = uni[arr] # 10 * 10 matrix
    

    在你的唯一值不是线性分布的情况下,你可以使用np.unique()提取arr的唯一值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      相关资源
      最近更新 更多