【问题标题】:python populate elements in arraypython填充数组中的元素
【发布时间】:2016-11-10 09:24:49
【问题描述】:

我对 Python 非常陌生(以前的 Matlab 用户)。

我有数组

y_pred =  [None] * 128

test_idx 是一个索引数组

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)

我想将test_idx对应的y_pred的值替换为数组results

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:只有一个元素的整数数组可以转换为索引

【问题讨论】:

  • y_pred 不是数组,而是list,不能像那样被索引。也许改用数组?
  • 另外,你真的应该使用numpy标签,你要问一个关于numpy数组的问题。
  • 你真的想要y_pred`` to be a list of None`s吗?不是零数组?什么是 Matlab 等价物?
  • 准确展示您的期望。当前示例中存在太多歧义。

标签: python arrays numpy


【解决方案1】:

您的 y_pred 是一个原生 Python 列表,您不能使用除整数以外的任何内容对其进行索引。您应该将其创建为一个 numpy 数组。

尝试如下初始化:

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

【讨论】:

  • 您必须仔细考虑是否使用None,这将迫使y_pred 具有object dtype,从而降低性能。
  • 是的,但这是一个值得一提的考虑因素,特别是如果 OP 是 python/numpy 的新手。
  • 是的,感谢您的 cmets,这很重要
  • @pt12lol:我相信您正在解决完全不同的问题。使用不同于整数的索引在这里不是问题。
  • @woockashek 不,这个问题显然与numpy有关。
【解决方案2】:

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

如果你想用pythonic的方式来做!你需要循环。 喜欢:

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

【讨论】:

    【解决方案3】:

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

    长版:

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

    最简单的方法是使用称为“哨兵”值的 numpy 数组,该值表示那里没有写入任何内容。此值最明显的选择可能是0NaN,但取决于您想要对结果做什么,它可能几乎是任何东西。 NaNNone 的壁橱,你会得到一个数字 numpy 数组,但是 0 可以使后面的一些计算更容易(例如 NaN != NaN,你需要使用 np.isnan 来识别 NaN 值)。

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

    【讨论】:

      【解决方案4】:

      你可以这样做:

      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
      

      我假设您的两个列表的长度相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2020-07-14
        • 2013-03-03
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多