首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Numpy-调用“数组创建函数”和“数组修改函数”之间的区别

Numpy-调用“数组创建函数”和“数组修改函数”之间的区别
EN

Stack Overflow用户
提问于 2022-09-05 06:44:22
回答 1查看 55关注 0票数 -3

为什么我们使用np作为前缀,通过使用numpy库中的函数来创建数组,而不是在调用“创建函数”时使用它。

代码语言:javascript
复制
import numpy as np 

例句:1.创造功能

代码语言:javascript
复制
arr=np.zeros(2)

这个数组创建了一个2乘2的数组,所有元素都为零。

2.除创造功能外->

代码语言:javascript
复制
arr.reshape(1,4)

这个修改创建的数组arr

现在您可以看到np被用作第一个的前缀,而不是第二个。既然它们都来自于numpy库,我们为什么不用它来重塑某种功能呢?

EN

Stack Overflow用户

发布于 2022-09-05 16:01:58

您需要阅读一些pythonnumpy基础知识。对于numpy来说,一个好的开端是

https://numpy.org/doc/stable/user/absolute_beginners.html

使用import numpy as np,您已经安装了一个名为npnamespace。使用np前缀引用名称空间中的项。

代码语言:javascript
复制
arr=np.zeros(2)

zeros是命名空间中的function。它接受一个参数(可能更多--参见文档),在这里2并返回一个numpy.ndarray对象(‘一个数组’)。这个表达式将它赋值给arr变量。

代码语言:javascript
复制
b = arr.reshape(1,4)

arr具有属性和方法。methods类似于函数,但它们被“接通”到特定对象,而不是np命名空间。这里reshape是方法,我们向它传递两个数字。它返回另一个数组。在更大的范围内,重要的是要知道这个b数组是一个view,尽管这不是当前的焦点。

代码语言:javascript
复制
b = np.reshape(a, (1,4))

numpy经常(但不总是)提供function版本的methods。对于大多数python模块来说,情况并非如此。

在交互式ipython会话中,我们可以测试代码:

代码语言:javascript
复制
In [32]: arr = np.zeros(4)
In [33]: arr
Out[33]: array([0., 0., 0., 0.])

In [34]: b =  arr.reshape(4,1)    
In [35]: b
Out[35]: 
array([[0.],
       [0.],
       [0.],
       [0.]])
    
In [37]: c = np.reshape(arr, (1,4))    
In [38]: c
Out[38]: array([[0., 0., 0., 0.]])

每个数组都有一个shape属性:

代码语言:javascript
复制
In [40]: arr.shape
Out[40]: (4,)    
In [41]: b.shape
Out[41]: (4, 1)    
In [42]: c.shape
Out[42]: (1, 4)

所有这些都不会修改arr。有些操作确实会修改数组,例如

代码语言:javascript
复制
In [44]: arr[1:3] = [1,2]
In [45]: arr
Out[45]: array([0., 1., 2., 0.])

虽然可以编写修改对象(例如数组)的functionsmethods,但大多数numpy对象不这样做。

实际工作的一个常见方法是附加的列表:

代码语言:javascript
复制
In [46]: alist = [1,2]
In [47]: alist.append([3,4])
In [48]: alist
Out[48]: [1, 2, [3, 4]]

在我的头上,sort是唯一一种适用于数组的方法:

代码语言:javascript
复制
In [49]: arr.sort()
In [50]: arr
Out[50]: array([0., 0., 1., 2.])

编辑

通常,职能的定义是:

代码语言:javascript
复制
 def foo(args):
     ....
     return ...

和班级

代码语言:javascript
复制
 class Foo():
     def __init__ ...
     def foo(self, args):
         ....

foo(1,2)f = Foo(); f.foo(....)连用。在这里,foo函数完全独立于Foo.foo方法。

numpy有大量的编译代码。np.array(...)创建一个numpy.ndarray对象。那个对象有很多方法。与reshape一样,它显式地定义了function等效项。这些函数通常将输入转换为数组(视需要而定),然后调用相应的方法。所有这些都不是python所隐含的。

使用我的示例,可以执行类似Foo.foo(f, args)的操作,即用类名引用方法,并将f对象传递为self。但这不是numpy正在做的事情。

每个类都有一组已定义的方法。listappendextendindex这样的东西。名称在其他类中可能类似,但操作是唯一的(除非类继承起作用)。

这不是在np.array上调用alist函数

代码语言:javascript
复制
In [58]: alist.array()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [58], in <cell line: 1>()
----> 1 alist.array()

AttributeError: 'list' object has no attribute 'array'

它要求list对象执行的是array方法--它没有这个方法。

类似地,如果我试图在数组上使用list方法:

代码语言:javascript
复制
In [59]: arr.append(3)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [59], in <cell line: 1>()
----> 1 arr.append(3)

AttributeError: 'numpy.ndarray' object has no attribute 'append'

我不愿在这个例子中使用append,因为这里有np.append函数,我不得不反复强调,它不是一个列表附加的克隆。它的名称很差,造成了各种各样的混乱。

使用DOCS

https://numpy.org/doc/stable/reference/generated/numpy.reshape.html https://numpy.org/doc/stable/reference/generated/numpy.ndarray.reshape.html https://numpy.org/doc/stable/reference/generated/numpy.ndarray.shape.html#numpy.ndarray.shape

https://numpy.org/doc/stable/reference/routines.html

这个numpy页面泛泛地谈到了routines,其中一些用于创建数组,另一些则被描述为操作。在这个列表中,像ndarray.flat这样的名称意味着它是一个数组方法,而不是一个模块函数。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73605440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档