python填充数组中的元素

时间:2016-11-10 09:24:50

标签: python arrays numpy

我是Python(以前的Matlab用户)的新手。

我有阵列

y_pred =  [None] * 128

test_idx是一个indeces数组

array([  3,   4,   5,  19,  28,  30,  38,  39,  47,  49,  50,  51,  54,
        64,  74,  81,  84,  85,  90,  91,  93,  97, 102, 103, 106, 107,
       109, 111, 115, 121], dtype=int64)

我想用数组results

替换test_idx对应的y_pred的值
array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
       0, 0, 0, 0, 0, 0, 0])

如果我尝试

y_pred[test_idx] = results

我收到错误: TypeError:只有一个元素的整数数组可以转换为索引

4 个答案:

答案 0 :(得分:1)

您的y_pred是一个原生Python列表,除了整数之外,您不能将其编入索引。你应该把它创建为一个numpy数组。

尝试按以下方式初始化:

import numpy as np
y_pred = np.array([None] * 128)

答案 1 :(得分:1)

我看到你在这里做了很多matlab;)

如果你想以pythonic方式做到这一点!你需要循环。 像:

for index, value in zip(test_idx, results):
    y_pred[index] = value

答案 2 :(得分:0)

你可以这样做:

for i in xrange(len(test_idx)):
    y_pred[test_idx[i]] = results[i]

或:

for key, val in zip(test_idx, results):
    y_pred[key] = val

我假设你的两个名单都有相同的长度。

答案 3 :(得分:0)

简短版本:将y_pred = [None] * 128替换为y_pred = np.full(128, np.NaN)。一旦你这样做,其他一切都会奏效。

长版:

其他人所说的问题是,y_pred是一个列表,而不是一个数组。列表不支持一次获取或设置多个索引,您需要使用numpy数组。

你想要的最简单方法是使用一个叫做“sentinel”值的numpy数组,这个值表示那里没有写任何东西。这个值最明显的选择可能是0NaN,但是根据你想要对结果做什么,它可能就是任何事情。 NaN是数字numpy数组None的壁橱,但0可以使稍后的计算变得更容易(例如NaN != NaN,你需要使用np.isnan 1}}以便稍后识别NaN值。

要使用零执行此操作,您可以将y_pred = [None] * 128替换为y_pred = np.zeros(128)。要使用NaN(或任何其他值),您可以使用y_pred = np.full(128, np.NaN)(还有一个np.ones,但我认为它不会对您有所帮助)。然后可以按原样使用其余代码。