【问题标题】:TypeError / Array indexing; 'int' object does not support item assignmentTypeError / 数组索引; “int”对象不支持项目分配
【发布时间】:2017-03-24 07:23:40
【问题描述】:

我有一个函数适用于包含多个项目的数组,但如果数组仅包含一项则失败。让我们考虑这个例子

import numpy as np

def checker(a):
   a[a>5] = np.nan

a = np.arange(10)
a = checker(a)

有效,但是

a = 1
a = checker(a)   # fails

并给出

Traceback (most recent call last):
   a[a>5] = np.nan
   TypeError: 'int' object does not support item assignment

我想像 MATLAB 一样处理它,而不喜欢这个版本的 checker(),它的行数比上面的版本多 4 倍。

def checker(a):
   try:
      a[a>5] = np.nan
   except TypeError:
      if a>5: a = np.nan

【问题讨论】:

  • 你想在这里做什么?
  • 我正在计算一些东西,前提是满足某些条件

标签: python numpy


【解决方案1】:

在 MATLAB 中,一切至少有 2 个维度;在numpy索引可以减少维数

np.shape(1)

()?这与np.array(1).shape 相同,即单个元素数组的形状(MATLAB 术语中的大小)。它是 0d,而不是 MATLAB 中的 2d。

a = np.empty(np.shape(1))*np.nan
# a = np.array(np.nan) does the same thing

nan,一个值为nan的单元素数组。

a[False]

显示为array([], dtype=float),形状为(0,);现在是 1d,但没有任何元素。

对于 0d 数组,唯一有意义的索引是 a[()],它返回元素 nannp.float64a.item() 也一样。

出于分配目的,我找不到更改该项目值的方法

a[???] = 0   

更正,可以使用省略号,因为它代表任意数量的:,包括无。

a[...] = 0
# array(0,0)

(你不需要a=0,因为那只是重新分配变量)。

一般来说,像这样的 0d 数组是可能的,但它们很少有用。

我不完全确定您要做什么(目前我没有有效的 Octave 会话)。但是,维度如何随索引而变化的这种差异是解决问题的关键。

a = np.array([np.nan])
a[np.array([False])] = 0   # no change
a[np.array([True])] = 0    # change

请注意,我将布尔索引设为数组,但只是一个标量或列表。这更接近您的 MATLAB 布尔索引。

【讨论】:

【解决方案2】:

要创建一个用nans 填充的空数组,可以使用np.fill

a=np.empty(np.shape(1))
a.fill(np.nan)
b=False

a[b]=10

您收到错误是因为 a 不是数组,而是浮点数。

【讨论】:

    【解决方案3】:

    当您将标量数组乘以标量时,numpy 会将结果强制转换为标量:

    >>> a = np.empty(())
    >>> a
    array(10.0)
    >>> a * 2
    20.0
    

    如果需要将标量保持为数组,可以使用np.asarray(a * 2)

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 2013-08-23
      • 2015-02-05
      • 1970-01-01
      • 2015-03-09
      • 2013-08-16
      • 2016-07-31
      相关资源
      最近更新 更多