TypeError: 只有整数标量数组可以转换为具有1D numpy索引数组的标量索引
TypeError: 只有整数标量数组可以转换为具有1D numpy索引数组的标量索引
我想写一个函数,根据提供的“bin概率”从训练集中随机选择元素。我将集合索引划分为11个“bin”,然后为它们创建自定义概率。\n
bin_probs = [0.5, 0.3, 0.15, 0.04, 0.0025, 0.0025, 0.001, 0.001, 0.001, 0.001, 0.001] X_train = list(range(2000000)) train_probs = bin_probs * int(len(X_train) / len(bin_probs)) # 将概率扩展到bin元素上 train_probs.extend([0.001]*(len(X_train) - len(train_probs))) # 修复元素数量匹配的小问题 train_probs = train_probs/np.sum(train_probs) # 归一化 indices = np.random.choice(range(len(X_train)), replace=False, size=50000, p=train_probs) out_images = X_train[indices.astype(int)] # 这是出错的地方
\n我得到以下错误:\n
TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array
\n我觉得很奇怪,因为我已经检查了我创建的索引数组。它是一维的,它是整数的,它是标量的。\n我错过了什么吗?\n注意:我尝试使用`astype(int)`传递`indices`。出现相同的错误。
问题的出现原因:
这个错误是由于在Python列表索引中使用了非整数标量数组而导致的。在给定的例子中,[1,2,3,4,5]是一个Python列表,而np.array([1])是一个包含一个整数1的一维NumPy数组。在尝试用np.array([1])来索引列表[1,2,3,4,5]时,出现了错误。
解决方法:
要解决这个问题,有几种方法可以使用:
1. 使用0维数组索引:可以使用np.array(1)来索引列表,因为这是一个0维数组索引。例如,[1,2,3,4,5][np.array(1)]会返回2。
2. 使用np.array([1]).item():可以使用np.array([1]).item()来索引列表,这将返回0维数组中的唯一元素。例如,[1,2,3,4,5][np.array([1]).item()]也会返回2。
3. 使用NumPy数组索引:如果要使用NumPy数组来索引列表,可以将列表转换为NumPy数组,然后使用数组索引。例如,np.array([1,2,3,4,5])[np.array([1])]将返回一个包含索引位置2的数组。
此外,还要注意Python列表索引比NumPy更加限制。在列表索引中,无法使用多个索引同时对列表进行索引。无论这些索引是在列表还是数组中。
编辑
重新审视代码中的这一段:
indices = np.random.choice(range(len(X_train)), replace=False, size=50000, p=train_probs)
indices是一个包含50000个整数的一维数组,但它肯定不是标量。它是一个包含50000个整数的数组。无论它们是在列表还是数组中,都无法同时使用多个索引对列表进行索引。
原因:TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array的错误是由于在使用np.concatenate函数时,参数传递方式不正确导致的。在上述示例中,错误的传递方式是将两个数组a分开传递,而正确的方式是将两个数组a作为一个元组传递给np.concatenate函数。
解决方法:正确的解决方法是将需要连接的数组作为一个元组传递给np.concatenate函数。在上述示例中,正确的代码如下:
a = np.eye(2) np.concatenate((a, a))
这样就能够正确地将两个数组a连接起来。
在使用np.concatenate函数时,要记得将需要连接的数组作为一个元组传递给函数,而不是分开传递。这样就能够避免出现(TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array)这个错误。
原因:出现这个问题的原因是因为X_train是一个列表,而不是一个numpy数组。无法对它使用数组索引。需要首先将其转换为数组。
解决方法:将X_train转换为数组可以解决这个问题。代码如下:
out_images = np.array(X_train)[indices.astype(int)]
如果列表太大无法转换为数组,可以尝试对原始列表进行洗牌。可以通过洗牌来解决这个问题。
另一种解决方法是使用列表推导式,如果坚持要保留X_train和out_images作为列表。代码如下:
out_images = [X_train[index] for index in indices]
如果确实有一个列表的列表,即无法转换为数组(每个列表的长度不同),可以按照Nuclear03020704回答中提到的方法使用列表推导式来解决。