在numpy中ndarray和array之间有什么区别?

flx*_*lxb 208 python arrays numpy multidimensional-array numpy-ndarray

ndarrayarrayNumpy有什么区别?我在哪里可以找到numpy源代码中的实现?

wim*_*wim 190

numpy.array只是一个创造一个便利功能ndarray; 它本身不是一个阶级.

您也可以使用创建数组numpy.ndarray,但不是推荐的方式.来自docstring numpy.ndarray:

阵列应该使用来构造array,zerosempty...这里给出的参数是指低级方法(ndarray(...)用于实例化阵列).

实现的大多数内容都是C代码,这里是多行的,但你可以在这里开始查看ndarray接口:

https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py

  • 仍然不知道为什么要避免使用 ndarray?因为它是低级的? (7认同)
  • 那么为什么不推荐呢? (5认同)
  • 如果你忘记'np.array`不是一个班级,就像我经常做的那样,这会让你感到害怕.`x = np.array([1,2.1,3])``if isinstance(x,np.array):#会给你一个TypeError` (4认同)
  • 通常,当您有一个类型(即“ndarray”)时,构造起来很复杂,会提供“array”、“zeros”等工厂方法来确保其正确构造。另外,也许 numpy 开发人员更喜欢在不同版本之间保持“array”、“zeros”的接口不变,但不会对“ndarray()”做出相同的保证 (2认同)

Ram*_*gil 44

numpy.array是一个返回a的函数numpy.ndarray.没有对象类型numpy.array.


Yin*_*ing 26

只需几行示例代码即可显示numpy.array和numpy.ndarray之间的区别

预热步骤:构建一个列表

a = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

检查类型

print(type(a))
Run Code Online (Sandbox Code Playgroud)

你会得到

<class 'list'>
Run Code Online (Sandbox Code Playgroud)

使用np.array构造一个数组(从列表中)

a = np.array(a)
Run Code Online (Sandbox Code Playgroud)

或者,您可以跳过预热步骤,直接进行

a = np.array([1,2,3])
Run Code Online (Sandbox Code Playgroud)

检查类型

print(type(a))
Run Code Online (Sandbox Code Playgroud)

你会得到

<class 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)

它告诉你numpy数组的类型是numpy.ndarray

您还可以检查类型

isinstance(a, (np.ndarray))
Run Code Online (Sandbox Code Playgroud)

你会得到的

True
Run Code Online (Sandbox Code Playgroud)

以下两行中的任何一行都会显示错误消息

np.ndarray(a)                # should be np.array(a)
isinstance(a, (np.array))    # should be isinstance(a, (np.ndarray))
Run Code Online (Sandbox Code Playgroud)


Mah*_*hat 6

numpy.ndarray()是一个类,numpy.array()而是一个方法/函数来创建ndarray

在 numpy 文档中,如果你想从ndarray类创建一个数组,你可以用引用的两种方式来完成:

1- using array(), zeros()or empty()methods: 数组应使用数组、零或空来构造(请参阅下面的另请参阅部分)。此处给出的参数是指ndarray(…)用于实例化数组的低级方法 ( )。

2-ndarray直接来自类: 有两种使用创建数组的模式__new__:如果缓冲区为无,则仅使用形状、数据类型和顺序。如果 buffer 是一个暴露缓冲区接口的对象,那么所有的关键字都会被解释。

下面的例子给出了一个随机数组,因为我们没有分配缓冲区值:

np.ndarray(shape=(2,2), dtype=float, order='F', buffer=None)

array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #random
Run Code Online (Sandbox Code Playgroud)

另一个示例是将数组对象分配给缓冲区示例:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])
Run Code Online (Sandbox Code Playgroud)

从上面的例子我们注意到我们不能将一个列表分配给“缓冲区”,我们不得不使用 numpy.array() 来返回缓冲区的 ndarray 对象

结论:numpy.array()如果你想制作一个numpy.ndarray()对象,请使用“