Python 巨蟒;如何最好地处理可能的0d阵列
Python numpy Ndarray让我失望了!我能回到Matlab吗 假设我有一个函数,它需要一个数组向量输入。我使用numpy.asarray函数强制输入到我想要的表单中,方便地避免了已经是ndarray的内容的重复。但是,如果传入标量,有时会将其放入0d数组而不是1d数组,具体取决于传入的方式。0d数组会导致问题,因为我可以索引到它 首先,为什么我不能?说Python 巨蟒;如何最好地处理可能的0d阵列,python,arrays,numpy,Python,Arrays,Numpy,Python numpy Ndarray让我失望了!我能回到Matlab吗 假设我有一个函数,它需要一个数组向量输入。我使用numpy.asarray函数强制输入到我想要的表单中,方便地避免了已经是ndarray的内容的重复。但是,如果传入标量,有时会将其放入0d数组而不是1d数组,具体取决于传入的方式。0d数组会导致问题,因为我可以索引到它 首先,为什么我不能?说x=np.array(1)。然后x.size==1,因此它应该有第0个元素。为什么我不能执行x[0]或x[-1]。我知道它想要像py
x=np.array(1)
。然后x.size==1
,因此它应该有第0个元素。为什么我不能执行x[0]
或x[-1]
。我知道它想要像python int一样,但是它应该比int更好,而不是故意给出相同的限制
其次,如果numpy asarray函数有一些可选的输入来强制输出至少是1d数组,那就太棒了。然后我可以做一些类似于x=np.asarray(x,force\u至少\u 1d=True)
但是,我能想到的最佳选择是检查ndim属性,如果它是0,则将其扩展为1。我觉得这不对。我还缺少其他选择吗
import numpy as np
def func(x, extra_check=True):
r"""Meaningless Example Function for stackoverflow."""
# force input to be ndarrays
x = np.asarray(x)
if x.size == 0:
print('Don''t do anything.')
# Extra test to deal with garbage 0D arrays so that they can be indexed by keep.
# This test is really bothering me. Is there a better way to make it unnecessary?
if extra_check and (x.ndim == 0):
x = x[np.newaxis]
if x[0] > 0 and x[-1] > 5:
print('Do something cool.')
else:
print('Do something less cool.')
if __name__ == '__main__':
# nominally intended use
x1 = np.array([1, 2, 10])
y1 = func(x1) # prints "Do something cool."
# single item use
x2 = x1[x1 == 2]
y2 = func(x2) # prints "Do something less cool."
# scalar single item use that works with extra check
x3 = x1[1]
y3 = func(x3) # prints "Do something less cool."
# scalar single item that will fail without extra check
x4 = x1[1]
y4 = func(x4, extra_check=False) # raises IndexError
所以我这里的主要问题是,是否有比我现有的更好的方法。如果没有,其他人是否同意应该有?我对Python比较陌生,所以我从未尝试过对源代码做出任何贡献,但我想我可以寻找另一个问题来向我解释这个过程
如果有必要,我将使用python v3.5.1和numpy 1.9.3。谢谢
其次,如果numpy asarray函数有一些可选的输入来强制输出至少是1d数组,那就太棒了。然后我可以做一些类似于x=np.asarray(x,force至少是真的)
np.asarray
没有,但是np.array
有--ndmin
--并且有一个专用的np.atleast_1d
函数(还有2和3):
任何数组都可以使用包含
x.ndim
元素的元组进行索引
2d:
1d:
0d:
为元素编制索引实际上并不返回标量
In [250]: x=np.array([[1]])
In [251]: type(x[0,0])
Out[251]: numpy.int32
In [252]: x[0,0][()]
Out[252]: array(1)
它返回一个dtype
对象,该对象接受0d索引
你提到MATLAB那里的一切都是2d(或更高);将0d设置为下限不是更符合逻辑吗?:)
另一个答案提到了ndmin
参数,以及至少1d
(还有一个2d和3d)。查看至少_1d
的文档和代码,了解它如何重塑各种案例。e、 g
if len(ary.shape) == 0 :
result = ary.reshape(1)
如果您需要类似MATLAB的2d数组,为什么不使用
np.array([[1]])
。我们一直使用np.array([[1,2],[3,4]])
之类的表达式。我个人认为numpy处理1D和0D数组是它比Matlab最大的优势之一。一切都是一致的。可以使用长度为2的元组为2D数组编制索引。0D阵列?长度为0的元组。很可爱。如果您正在编写在真正的ND阵列上运行的函数,那么Matlab实现将成为所有特殊情况下的实现。谢谢。我将把x=np.asarray(x)
替换为x=np.asarray(x))
并去掉额外的检查。这似乎是一个相当干净的方法。np.至少1d(x)
应该足够了,因为它首先会自动将非ndarray
输入转换为ndarray
。谢谢。在本例中,我不知道如何使用tuple来帮助您,但值得一提。我有点习惯了1d数组,可以看出区分向量和矩阵的吸引力,尽管我还没有完全了解0d版本。有一些索引方法不会降低维度-x1[[1]]
,x1[:1]
,等等。输出不正确-x[0,0][()]
不是一个array@Eric,现在它是一个numpy.int32
。我不知道为什么我去年发布了array(1)
;它看起来像一个复制粘贴(来自早期版本)。。但我的观点仍然是,dtype
对象的行为类似于0d数组。我想你指的是np.generic
对象。有人建议将isinstance(np.int32,np.dtype)
设置为true,但这还有很长的路要走,即使这样也不会使isinstance(np.int32(1),np.dtype)
设置为true。
In [241]: x=np.array([1])
In [242]: x[(0,)] # (0,) to distinguish from (0)==0
Out[242]: 1
In [243]: x=np.array(1)
In [244]: x[()] # empty tuple
Out[244]: 1
In [250]: x=np.array([[1]])
In [251]: type(x[0,0])
Out[251]: numpy.int32
In [252]: x[0,0][()]
Out[252]: array(1)
if len(ary.shape) == 0 :
result = ary.reshape(1)