【问题标题】:indexing a numpy array containing functions索引包含函数的 numpy 数组
【发布时间】:2016-11-07 21:31:16
【问题描述】:

我有一个 Numpy 数组,“nFuncs”包含函数对象作为打击:

array([ [<bound method ncNN.sigmoid of <__main__.ncNN object at 0x11c01f510>>, 
         <bound method ncNN.sigmoid of <__main__.ncNN object at 0x11c01f510>>, 
         <bound method ncNN.sigmoid of <__main__.ncNN object at 0x11c01f510>>],
        [<bound method ncNN.sigmoid of <__main__.ncNN object at 0x11c01f510>>,
         <bound method ncNN.sigmoid of <__main__.ncNN object at 0x11c01f510>>]], dtype=object)

索引这个数组的合法方法是什么? 当我尝试 nFuncs[1,1] 时,出现 IndexError:数组索引过多。但是,nFuncs[1][1] 有效。你能解释一下为什么我不能使用 nFuncs[1,1] 吗?

【问题讨论】:

  • 它可以存储为列表列表。你试过type(nFuncs[1])吗?
  • shape 是什么?
  • @hpaulj 它是 (2,)
  • @DeanLa 是的,它是一个列表。
  • 所以是1d的,只能用[1]索引。

标签: python numpy


【解决方案1】:

制作嵌套列表:

In [8]: alist=[[1,2,3],[4,5]]
In [9]: len(alist)
Out[9]: 2

这是一个包含 2 个项目的列表;这些项目恰好是列表。在某种元视图中它是 2d 的,但列表本身并不是 2d 的。

从中创建一个数组:

In [10]: arr = np.array(alist)
In [11]: arr.shape
Out[11]: (2,)
In [12]: arr.dtype
Out[12]: dtype('O')
In [13]: arr
Out[13]: array([[1, 2, 3], [4, 5]], dtype=object)
In [14]: arr[0]
Out[14]: [1, 2, 3]
In [15]: type(arr[0])
Out[15]: list

它也有 2 个元素,实际上与 alist 相同的 2 个子列表(相同的 id)

In [16]: id(alist[0])
Out[16]: 2992863468
In [17]: id(arr[0])
Out[17]: 2992863468

如果我更改其中一个子列表的元素,更改将出现在另一个结构中

In [18]: arr[0][1]=3
In [19]: arr
Out[19]: array([[1, 3, 3], [4, 5]], dtype=object)
In [20]: alist
Out[20]: [[1, 3, 3], [4, 5]]

在大多数情况下,像这样的对象数组就像一个列表。你可以重塑它,例如。 `arr.reshape(2,1)',但你不能附加到它。并且要执行大多数操作,您(或 numpy)必须像列表一样遍历元素。

与二维整数数组对比

In [21]: A=np.array([[1,2,3],[4,5,6]])
In [22]: A
Out[22]: 
array([[1, 2, 3],
       [4, 5, 6]])
In [23]: A.shape
Out[23]: (2, 3)
In [24]: A.dtype
Out[24]: dtype('int32')

如果我将arr 的元素更改为数组,可能会显示object 障碍:

In [26]: arr[0]=np.array(arr[0])
In [27]: arr[1]=np.array(arr[1])
In [28]: arr
Out[28]: array([array([1, 3, 3]), array([4, 5])], dtype=object)

现在是一个数组数组;但这仍然与二维数组不同。

【讨论】:

  • 非常感谢您的友好解释。现在我想我开始了解对象数组和其他一些类型的数组(?)之间的区别。还有几个问题。什么时候将数组初始化为对象数组和固定类型数组?例如,A = np.array([['1','1'],['sd','a']]) 使 "'|S2'" 类型(?)二维数组,而不是对象数组。那么,我是否可以认为,如果我创建一个包含相同长度的子元素的数组,它总是会创建一个固定类型的多维数组?另外,您能否解释一下高维数组中 A[x,x] 索引背后的原理?
  • np.array 尝试创建尽可能高的维度数组 - 通过等长嵌套数组一直向下工作。限制该深度需要一些技巧。这是许多 SO 问题的主题。
  • 非常感谢。我会查看更多文档
【解决方案2】:

数组的形状为 (2,):它是一维的。这是因为构造函数中的第一个和第二个子列表的长度不同。所以这被解释为 2 个列表的一维数组。要获取函数数组,请将函数插入第二个列表(或从第一个列表中删除一个)。

【讨论】:

  • 感谢您的意见。那么,如果我只想像上面那样使用数组,那么它是唯一的方法来索引 name[I][j] 吗?
  • 在任何情况下,您都必须先索引数组,然后再索引结果列表。原则上有更复杂的方法来索引数组,但我认为这对你的情况没有意义或帮助。
  • 然后,像 a = np.array([[1,2,3],[4,5,6]]) 这样的 Numpy 数组是一个例外,因为我可以使用[1, 2]?
  • 规则多于例外 :) 要访问这样的元素,您需要一个 2D 数组,该数组不能由 2 个不同长度的列表构成,因此 numpy 不会并为您提供而是列表数组。
猜你喜欢
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多