Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 巨蟒;如何最好地处理可能的0d阵列_Python_Arrays_Numpy - Fatal编程技术网

Python 巨蟒;如何最好地处理可能的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

Python numpy Ndarray让我失望了!我能回到Matlab吗

假设我有一个函数,它需要一个数组向量输入。我使用numpy.asarray函数强制输入到我想要的表单中,方便地避免了已经是ndarray的内容的重复。但是,如果传入标量,有时会将其放入0d数组而不是1d数组,具体取决于传入的方式。0d数组会导致问题,因为我可以索引到它

首先,为什么我不能?说
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)