Numpy&Pandas学习笔记

numpy中文网:https://www.numpy.org.cn/about/

安装:pip install numpy /pip3 install pandas(Python3)

NumPy是使用Python进行科学计算的基础包。它包含如下的内容:

  • NumPy包的核心是 ndarray 对象。它封装了python原生的同数据类型的 n 维数组,为了保证其性能优良,其中有许多操作都是代码在本地进行编译后执行的。
  • 复杂的(广播)功能。/ 矢量化
  • 用于集成C / C ++和Fortran代码的工具。
  • 有用的线性代数,傅里叶变换和随机数功能。

广播是用于描述操作的隐式逐元素行为的术语; 一般来说,在NumPy中,所有操作,不仅仅是算术运算,而是逻辑,位,功能等,都以这种隐式的逐元素方式表现,即它们进行广播。

NumPy数组 和 原生Python Array(数组)之间有几个重要的区别:

  • NumPy 数组在创建时具有固定的大小,与Python的原生数组对象(可以动态增长)不同。更改ndarray的大小将创建一个新数组并删除原来的数组。
  • NumPy 数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同。 例外情况:Python的原生数组里包含了NumPy的对象的时候,这种情况下就允许不同大小元素的数组。
  • NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常,这些操作的执 行效率更高,比使用Python原生数组的代码更少。
  • 越来越多的基于Python的科学和数学软件包使用NumPy数组; 虽然这些工具通常都支持Python的原生数组作为参数,但它们在处理之前会还是会将输入的数组转换为NumPy的数组,而且也通常输出为NumPy数组。换句话说,为了高效地使用当今科学/数学基于Python的工具(大部分的科学计算工具),你只知道如何使用Python的原生数组类型是不够的 - 还需要知道如何使用 NumPy 数组。

NumPy的数组类被调用ndarrayndarray对象属性是:

  • ndarray.ndim - 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
  • ndarray.shape - 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有 n 行和 m 列的矩阵,shape 将是 (n,m)。因此,shape 元组的长度就是rank或维度的个数 ndim
  • ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积。
  • ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
  • ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。它等于 ndarray.dtype.itemsize 。
  • ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。

数组创建

  • array函数

使用array函数从常规Python列表或元组中创建数组。得到的数组的类型是从Python列表中元素的类型推导出来的。

>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

一个常见的错误,就是调用array的时候传入多个数字参数,而不是提供单个数字的列表类型作为参数。

>>> a = np.array(1,2,3,4)    # WRONG
>>> a = np.array([1,2,3,4])  # RIGHT

  •  zeros/ones/empty 

通常,数组的元素最初是未知的,但它的大小是已知的。因此,NumPy提供了几个函数来创建具有初始占位符内容的数组。这就减少了数组增长的必要,因为数组增长的操作花费很大。

np.zeros( (3,4) ) # 3行4列
np.ones( (2,3,4), dtype=np.int16 ) # dtype can also be specified
np.empty( (2,3) )  

函数zeros创建一个由0组成的数组,函数 ones创建一个完整的数组,函数empty 创建一个数组,其初始内容是随机的,取决于内存的状态。默认情况下,创建的数组的dtype是 float64 类型的。

  • arange

NumPy提供了一个类似于Python中range的函数,也和Python一样是左闭右开。 

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )                 # it accepts float arguments
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])
  • linspace

arange与浮点参数一起使用时,由于有限的浮点精度,通常不可能预测所获得的元素的数量。出于这个原因,通常最好使用linspace函数来接收我们想要的元素数量的函数,而不是步长(step),自动匹配步长:

>>> from numpy import pi
>>> np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
>>> x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
>>> f = np.sin(x)
  • a = np.random.random((2,3)) 

2行3列,数值为(0,1)的数字

打印数组

当您打印数组时,NumPy以与嵌套列表类似的方式显示它,但具有以下布局:

  • 最后一个轴从左到右打印,
  • 倒数第二个从上到下打印,
  • 其余部分也从上到下打印,每个切片用空行分隔。

然后将一维数组打印为行,将二维数据打印为矩阵,将三维数据打印为矩数组表。

>>> c = np.arange(24).reshape(2,3,4)         # 3d array
>>> print(c)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

如果数组太大而无法打印,NumPy会自动跳过数组的中心部分并仅打印角点。

基本操作

数组上的算术运算符会应用到 元素 级别。(对应元素计算)

与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行运算

矩阵乘积可以使用@运算符(在python> = 3.5中)或dot函数或方法执行:

>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )
>>> A * B                       # elementwise product
array([[2, 0],
       [0, 4]])
>>> A @ B                       # matrix product
array([[5, 4],
       [3, 4]])
>>> A.dot(B)                    # another matrix product
array([[5, 4],
       [3, 4]])

幂: **

a<35
array([ True, True, False, False])

某些操作(例如+=和 *=)会更直接更改被操作的矩阵数组而不会创建新矩阵数组。

许多一元操作,例如计算数组中所有元素的总和,都是作为ndarray类的方法实现的。可以通过指定axis 参数,您可以沿数组的指定轴应用操作:axis=0→沿列操作;axis=1→沿行操作    

>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>>
>>> b.sum(axis=0)                            # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1)                            # min of each row
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1)  # cumulative sum along each row 每行的累积总和
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])
>>> np.diff(b)    #相邻作差
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
>>> b.argmin()  # 最小值的索引
0
>>> b.mean() # 也可以指定维度
>>> np.median(b)
>>> b.nonzero()
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), 
 array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)) #行,列坐标
>>> b.transpose()  # 转置=b.T,但都不会改变b本身。

>>> b.clip(3,8)  # 小于3的置3,大于8的置8,其余的不变。
array([[3, 3, 3, 3],
       [4, 5, 6, 7],
       [8, 8, 8, 8]])

索引、切片和迭代

索引

索引还是要注意从0开始。

一维的数组可以进行索引、切片和迭代操作的,就像 列表 和其他Python序列类型一样。

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
>>> a[:6:2] = -1000    # equivalent to a[0:6:2] = -1000;
>>> a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])
>>> a[ : :-1]  # 倒序开始
array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])
>>> for i in a:
...     print(i**(1/3.))

 多维的数组每个轴可以有一个索引。这些索引以逗号​​分隔的元组给出:

>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> b[2,3] # =b[2][3]
23
>>> b[0:5, 1]                       # each row in the second column of b
array([ 1, 11, 21, 31, 41])

 当提供的索引少于轴的数量时,缺失的索引被认为是完整的切片:

>>> b[-1]   # the last row. Equivalent to b[-1,:]
array([40, 41, 42, 43])

 也可以用三个点( ... )表示产生完整索引元组所需的冒号。

  • x[1,2,...] 相当于 x[1,2,:,:,:]
  • x[...,3] 等效于 x[:,:,:,:,3]
  • x[4,...,5,:] 等效于 x[4,:,:,5,:]

使用索引数组进行索引

>>> a = np.arange(12)**2   # the first 12 square numbers
array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121],
      dtype=int32)
>>> i = np.array( [ 1,1,3,8,5 ] )  # an array of indices
>>> a[i]                            # the elements of a at the positions i
array([ 1,  1,  9, 64, 25])
>>>
# 二维索引数组 a bidimensional array of indices 
>>> j = np.array( [ [ 3, 4], [ 9, 7 ] ] )  
>>> a[j]                                   # the same shape as j
array([[ 9, 16],
       [81, 49]])

当索引数组a是多维的时,单个索引数组指的是第一个维度a。以下示例通过使用调色板将标签图像转换为彩色图像来显示此行为。 

>>> palette = np.array( [ [0,0,0],                # black
...                       [255,0,0],              # red
...                       [0,255,0],              # green
...                       [0,0,255],              # blue
...                       [255,255,255] ] )       # white
>>> image = np.array( [ [ 0, 1, 2, 0 ],           # each value corresponds to a color in the palette
...                     [ 0, 3, 4, 0 ]  ] )
>>> palette[image]                            # the (2,4,3) color image
array([[[  0,   0,   0],
        [255,   0,   0],
        [  0, 255,   0],
        [  0,   0,   0]],
       [[  0,   0,   0],
        [  0,   0, 255],
        [255, 255, 255],
        [  0,   0,   0]]])

迭代

对多维数组进行 迭代(Iterating) 是相对于第一个轴完成的(行)

>>> for row in b:
...     print(row)
...
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]

若要对列迭代:可以用到转置

>>> for column in b.T:
...     print(column)

但是,如果想要对数组中的每个元素执行操作,可以使用flat属性(摊平),该属性是数组的所有元素的迭代器。而 b.flatten() 返回一个被改变的array,b.ravel() 也有相同的效果,但它属于引用操作。

“ravel()和flatten()是将多维数据展平为一维数据,功能相同,区别在于一个是引用操作,一个是复制操作。ravel()展平数据后,修改后面的数据会影响前面的数据,而flatten()展平数据后,不会影响前面的数据。”

>>> for element in b.flat:
...     print(element)
...
0
1
2
3
...

形状操纵

shape返回tuple类型,单个元素后面必须写逗号。

>>> a = np.array([2,3,4])
>>> a.shape
(3,)

b.ravel() b.reshape() b.T 可以更改数组的形状,返回一个修改后的数组,但不会更改原始数组。而 ndarray.resize() 方法会修改数组本身。b.T 对于一维数组不能把横向的变成纵向的。

如果在 reshape 操作中将 size 指定为-1,则会自动计算其他的 size 大小。

>>> a = np.floor(10 * np.random.random((3, 4)))
>>> a
array([[2., 1., 7., 1.],
       [2., 3., 5., 4.],
       [9., 3., 6., 8.]])
>>> a.reshape(2,-1)
array([[2., 1., 7., 1., 2., 3.],
       [5., 4., 9., 3., 6., 8.]])

将不同数组堆叠在一起

几个数组可以沿不同的轴堆叠在一起,例如:

>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[ 8.,  8.],
       [ 0.,  0.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[ 1.,  8.],
       [ 0.,  4.]])
>>> np.vstack((a,b)) # 上下合并
array([[ 8.,  8.],
       [ 0.,  0.],
       [ 1.,  8.],
       [ 0.,  4.]])
>>> np.hstack((a,b)) # 左右合并
array([[ 8.,  8.,  1.,  8.],
       [ 0.,  0.,  0.,  4.]])

 1D数组作为列堆叠到2D数组中:

>>> a = np.array([4.,2.])
>>> b = np.array([3.,8.])
>>> a[:,np.newaxis]  # 针对列表的操作[] this allows to have a 2D columns vector
array([[ 4.],
       [ 2.]])
>>> a[np.newaxis,:]
array([[4., 2.]])

column_stack 将1D数组作为堆叠到2D数组中。 

>>> a = np.array([4.,2.])
>>> b = np.array([3.,8.])
>>> np.column_stack((a,b))     # returns a 2D array
array([[ 4., 3.],
       [ 2., 8.]])
>>> np.column_stack((a[:,np.newaxis],b[:,np.newaxis]))
array([[ 4.,  3.],
       [ 2.,  8.]])
>>> np.hstack((a[:,np.newaxis],b[:,np.newaxis]))   # the result is the same
array([[ 4.,  3.],
       [ 2.,  8.]])

row_stack() 等效vstack.

concatenate() 可通过axis自定义合并的维度。

>>> np.concatenate((a,b),axis=0)
array([4., 2., 3., 8.])
>>> np.concatenate((a[:,np.newaxis],b[:,np.newaxis]),axis=1)
array([[4., 3.],
       [2., 8.]])

将一个数组拆分成几个较小的数组

使用hsplit,可以沿数组的水平轴拆分数组,方法是指定要返回的形状相等的数组的数量,或者指定应该在其之后进行分割的列:

>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[ 9.,  5.,  6.,  3.,  6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],
       [ 1.,  4.,  9.,  2.,  2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])
>>> np.hsplit(a,3)   # Split a into 3
[array([[ 9.,  5.,  6.,  3.],
       [ 1.,  4.,  9.,  2.]]), array([[ 6.,  8.,  0.,  7.],
       [ 2.,  1.,  0.,  6.]]), array([[ 9.,  7.,  2.,  7.],
       [ 2.,  2.,  4.,  0.]])]
>>> np.hsplit(a,(3,4))   # Split a after the third and the fourth column
[array([[ 9.,  5.,  6.],
       [ 1.,  4.,  9.]]), array([[ 3.],
       [ 2.]]), array([[ 6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],
       [ 2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])]

同样 vsplit() 沿垂直轴分割,np.split(array, x, axis=1) 允许指定要分割的轴;np.array_splist(),可以进行不匹配维度的分隔。

拷贝和视图

“引用”完全不复制:变量赋值

简单分配不会复制数组对象或其数据。“引用”,具有关联性;

常用 ‘b is a‘ 这个判断语句的检查两者是否指向同一个内容。和Python相同。

>>> a = np.arange(12)
>>> b = a            # no new object is created
>>> b is a           # a and b are two names for the same ndarray object
True
>>> b.shape = 3,4    # changes the shape of a
>>> a.shape
(3, 4)

深拷贝 deep copy

copy() 方法生成数组及其数据的完整副本

>>> d = a.copy()  # a new array object with new data is created
>>> d is a
False
>>> d.base is a  # d doesn't share anything with a
False
>>> d[0,0] = 9999
>>> a
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])

有时,如果不再需要原始数组,则应在切片后调用 copy。例如,假设a是一个巨大的中间结果,最终结果b只包含a的一小部分,那么在用切片构造b时应该做一个深拷贝:

>>> a = np.arange(int(1e8))
>>> b = a[:100].copy()
>>> del a  # the memory of ``a`` can be released.

如果改为使用 b = a[:100],则 ab 引用,并且即使执行 del a 也会在内存中持久存在。

视图或浅拷贝

不同的数组对象可以共享相同的数据。该view方法创建一个查看相同数据的新数组对象.

>>> c = a.view()
>>> c is a
False
>>> c.base is a     # c is a view of the data owned by a
True
>>> c.flags.owndata
False
>>>
>>> c.shape = 2,6    # a's shape doesn't change
>>> a.shape
(3, 4)
>>> c[0,4] = 1234    # a's data changes
>>> a
array([[   0,    1,    2,    3],
       [1234,    5,    6,    7],
       [   8,    9,   10,   11]])

切片数组会返回一个视图:

>>> s = a[ : , 1:3] 
# spaces added for clarity; could also be written "s = a[:,1:3]"
>>> s[:] = 10   
# s[:] is a view of s. Note the difference between s=10 and s[:]=10
>>> a
array([[   0,   10,   10,    3],
       [1234,   10,   10,    7],
       [   8,   10,   10,   11]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: numpy是一个高性能的科学计算库,用于处理大型数据集和矩阵运算。它是Python科学计算生态系统中最重要的库之一,提供了丰富的功能和工具。 在numpy学习过程中,我创建了一个名为"numpy笔记.xmind"的思维导图来总结和记录重要的概念和函数。 首先,我在思维导图中列出了numpy的基本数据结构,包括多维数组(ndarray)、切片和索引。我理解了如何创建和操作这些数据结构,以及如何使用切片和索引访问数组中的元素。 其次,在思维导图中,我详细记录了numpy中的常用函数和方法。这些函数包括数学运算(如加法、乘法和指数运算)、统计函数(如平均值、标准差和方差)和数组操作(如形状变换、拼接和切割)。对于每个函数,我还注明了其参数和用法,以便以后参考。 此外,我还在思维导图中添加了numpy的广播功能和ufunc函数。广播允许我们在不同形状的数组之间进行元素级别的操作,而ufunc函数则可以对数组进行逐元素的函数调用。对于这两个功能,我记录了它们的应用场景和使用方法。 最后,我在思维导图中补充了一些numpy的高级特性和应用,如随机数生成、文件IO以及与其他科学计算库(如pandas和matplotlib)的集成。这些特性和应用使numpy成为了进行数据分析和科学计算的重要工具。 通过创建和总结"numpy笔记.xmind"这个思维导图,我能够更好地理解和掌握numpy的知识。这份笔记将成为我学习和使用numpy的重要参考资料,帮助我在科学计算和数据分析的过程中提高效率和准确性。 ### 回答2: numpy(Numerical Python)是Python中用于进行科学计算的一个库。它提供了丰富的高性能数值计算工具,特别是对于大规模多维数组的操作。下面是关于numpy的一些笔记。 1. 数组的创建:numpy使用ndarray对象来存储多维数组。可以使用numpy.array()函数创建数组,也可以使用numpy.zeros()、numpy.ones()等函数创建特定初始值的数组。 2. 数组的属性:可以使用ndarray的属性来获取数组的形状、大小、数据类型等信息。例如,shape属性可以得到数组的维度大小,dtype属性可以得到数组的数据类型。 3. 数组的索引和切片:可以通过索引来访问数组中的元素。numpy中的索引从0开始,可以使用负数表示相对于数组尾部的位置。切片可以用来获取数组的部分元素。可以使用冒号分隔切片的起始、结束和步长值。 4. 数组的运算:numpy支持对数组的逐元素运算,包括加减乘除、求幂、取余等。可以使用numpy的函数进行常见的数学运算,也可以使用ndarray对象的方法进行相应的操作。 5. 广播:numpy中的广播机制可以自动处理形状不一致的数组之间的运算。广播可以使得形状不一致的数组能够按需扩展以便进行元素运算,而不需要进行明确的形状调整操作。 6. 数组的重塑和转置:可以使用reshape()函数对数组进行重新排列,改变其形状。transpose()函数可以用来进行数组的转置操作。 7. 数组的聚合操作:numpy提供了很多用于数组聚合操作的函数,例如对数组进行求和、求平均、求最大最小值等。 8. 数组的存储和读取:可以使用numpy提供的函数将数组保存到文件中,也可以使用numpy的load()函数从文件中加载数组。 以上是关于numpy的一些基础笔记numpy在科学计算、数据分析等领域具有广泛的应用。掌握numpy的基本操作和常用函数,能够更高效地进行数值计算和数据处理任务。 ### 回答3: numpy是一个开源的Python库,提供了高效的多维数组对象以及对数组操作的函数。笔记.xmind是一种思维导图的文件格式。结合两者,我可以将numpy的使用方法和相关概念通过思维导图的方式记录下来。 在笔记.xmind中,我可以使用中心主题表示numpy,然后通过子主题展开numpy的各个方面。例如,我可以创建一个子主题来介绍numpy的数组对象,包括数组的创建、形状、类型等信息。另外,我还可以创建子主题来记录numpy数组操作的函数,例如数组的索引与切片操作、数组的运算操作等。在每个子主题中,我可以使用节点来记录具体的代码示例,以及相关的说明和注意事项。 除了记录numpy的使用方法外,我还可以创建子主题来介绍numpy中的常用概念和特性。例如,我可以创建一个子主题来介绍numpy中的广播机制,以及在数组运算中的应用。另外,我还可以创建子主题来介绍numpy中的向量化操作和矩阵运算,以及其在科学计算中的重要性。 在整个思维导图中,我可以使用不同的颜色、字体和图标来区分不同的主题或节点,以便更好地组织和呈现信息。可以使用箭头来表示不同主题之间的关系,例如通过箭头表示某个主题是另一个主题的子主题或相关主题。 通过将numpy的使用方法和相关概念以思维导图的形式记录在笔记.xmind中,我可以更清晰地了解和掌握numpy的知识,并且可以随时查阅和复习。这样可以帮助我更好地应用numpy进行数据分析和科学计算,并提高工作效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值