Python中使用Numpy随机删除数组元素:ValueError: a must be 1-dimensional解决方案

在使用 np.random.choice() 函数从二维数组中随机选择元素时,你可能会遇到 ValueError: a must be 1-dimensional 错误。这个错误提示你输入的数组必须是一维的,而你提供的是二维数组。

错误原因:

np.random.choice() 函数用于从给定的一维数组中随机选择元素。当你将 np.where(physicalNetwork > 0) 的结果作为参数传递给 np.random.choice() 时,实际上你传递的是一个二维数组,因为 np.where() 返回的是满足条件的元素的索引,而二维数组的索引是二维的。

解决方案:

为了解决这个问题,我们需要将二维数组转换为一维数组。可以使用 np.where()[0] 获取满足条件的元素的一维索引数组,或者使用 np.flat 将二维数组展平为一维数组。

以下代码展示了如何修改你的代码以解决此错误:pythonimport numpy as npimport pandas as pdfrom collections import dequeimport heapq

读取网络数据logicalNetwork = pd.read_excel('逻辑网络1.xls', header=None).to_numpy()physicalNetwork = pd.read_excel('物理网络1.xls', header=None).to_numpy()

获取网络的节点数num_nodes = logicalNetwork.shape[0]

用于存储已经存在的路径existing_paths = set()

随机删除6条物理路径np.random.seed(0)

方法一:使用 np.where()[0] 获取一维索引数组deleted_paths = np.random.choice(np.where(physicalNetwork > 0)[0], size=6, replace=False)

方法二:使用 np.flat 将二维数组展平为一维数组# deleted_paths = np.random.choice(physicalNetwork.flat[np.where(physicalNetwork > 0)], size=6, replace=False)

for path in deleted_paths: physicalNetwork[np.unravel_index(path, physicalNetwork.shape)] = 0

以下省略部分代码...

代码解释:

  • 方法一 使用 np.where(physicalNetwork > 0)[0] 获取满足条件 physicalNetwork > 0 的元素的一维索引数组,然后将其传递给 np.random.choice() 函数。* 方法二 使用 physicalNetwork.flat 将二维数组 physicalNetwork 展平为一维数组,然后使用 np.where(physicalNetwork > 0) 获取满足条件的元素的索引,最后使用这些索引从展平后的数组中选择元素。

选择哪种方法取决于你的实际需求和代码风格。两种方法都可以有效解决 ValueError: a must be 1-dimensional 错误,并让你能够使用 np.random.choice() 函数从二维数组中随机选择元素。


原文地址: https://www.cveoy.top/t/topic/UpR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录