Numpy笔记

NDARRAY对象

任何的Numpy的数据对象都是一个N维数组。最基础的创建方式是:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

各个参数的说明:

ARRAY属性

ndarry.shape

返回一个tuple代表数组的形状。或者用来改变数组的形状。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape)
a.shape = (3, 2)
print(a)
print(a.shape)
b = a.reshape(2, -1)
print(b)

输出结果:

[[1 2 3]
 [4 5 6]]
(2, 3)
[[1 2]
 [3 4]
 [5 6]]
(3, 2)
[[1 2 3]
 [4 5 6]]

改变形状也可以用reshape操作。但是reshape不是直接在原来的数组上进行操作,而是返回一个新的数组。-1表示根据实际情况进行计算。

ndarry.ndim

返回数组的维数。

python
print(a.ndim)

输出2

创建ARRAY

主要是下面这三个:

numpy.empty(shape, dtype=float, order='C')  # 空数组,值是任意的
numpy.zeros(shape, dtype=float, order='C')  # 全0数组
numpy.ones(shape, dtype=float, order='C')  # 全1数组

‘C’代表是C语言风格,一般不用

从现有的数据中创建ARRAY

numpy.asarray(a, dtype=None, order=None)

参数说明:

import numpy as np

l = [1, 2, 3]
a = np.asanyarray(l, dtype=float)
print(a)

l1 = (1, 2, 3)
b = np.asanyarray(l1, dtype=int)
print(b)

l2 = [(1, 2, 3), (4, 5)]
c = np.asanyarray(l2)
print(c)

输出结果:

[1. 2. 3.]
[1 2 3]
[(1, 2, 3) (4, 5)]

根据数据范围创建ARRAY

numpy.arange

numpy.arange(start, stop, step, dtype)

参数说明:

import numpy as np

x = np.arange(5)
print(x)
x = np.arange(5, dtype=float)
print(x)
x = np.arange(10, 20, 2)
print(x)

结果:

[0 1 2 3 4]
[0. 1. 2. 3. 4.]
[10 12 14 16 18]

numpy.linspace

numpy.linespace(start, stop, num, endpoint, retstep, dtype)

参数说明:

一般运算和矩阵运算

一般运算

一般的数组间的运算,一般的运算,要求两个数组的形状都是一样的。进行的操作是每个对应的元素的。而且不是直接在原来的数据上进行运算,而是返回一个新的数组。

import numpy as np

a = np.array([[1., 2., 3.], [4., 5., 6.]])
b = np.array([[-3., -2., -1.], [-6., -5., -4.]])

# 都是对应元素的操作
print(np.add(a, b))
print(np.subtract(a, b))
print(np.multiply(a, b))
print(np.divide(a, b))
print(np.reciprocal(a))  # 倒数
print(np.power(b, a))  # b^a
print(np.sin(a))

输出结果:

[[-2.  0.  2.]
 [-2.  0.  2.]]
[[ 4.  4.  4.]
 [10. 10. 10.]]
[[ -3.  -4.  -3.]
 [-24. -25. -24.]]
[[-0.33333333 -1.         -3.        ]
 [-0.66666667 -1.         -1.5       ]]
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]
[[-3.000e+00  4.000e+00 -1.000e+00]
 [ 1.296e+03 -3.125e+03  4.096e+03]]
[[ 0.84147098  0.90929743  0.14112001]
 [-0.7568025  -0.95892427 -0.2794155 ]]

矩阵运算

在numpy中,一般用一维数组表示向量,二维数组表示矩阵,多维数组表示张量。一维数组默认为行向量。之后借助numpy的线性代数库解决问题。
一般举例:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[11, 12], [13, 14]])
x = [3, 4]
print(np.dot(a, b))  # 二维情况下就是矩阵乘法
print(np.vdot(a, b))  # 对应行向量的内积的累加和 1*11 + 2*12 + 3*13 + 4*14 = 130

# 一维情况表示内积,多维情况表示交叉的内积
print(np.inner(a, b))
'''
1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14 
'''

print(np.linalg.det(a))  # 计算行列式
print(np.linalg.solve(a, b))  # ax=b 求解x
print(np.linalg.inv(a))  # 逆矩阵

BROADCAST广播机制

一种更加高效的数组(张量)运算机制,减少了数据复制的步骤。这篇文章详细介绍了一些基本概念。
简单来说,python把数组进行伸展,然后进行计算。进行广播需要满足下列两个先决条件中的至少一个:

  • 两个张量的trailing axes必须一致
  • 两个张量之中的至少一个张量的的axes必须是1

假设有一个RGB图片,有3个channel,我们想要把每个channel的图层进行不同的数据添加,可以用这种方式:

      Image  (3d array): 256 x 256 x 3
      Scale  (1d array):             3
      Result (3d array): 256 x 256 x 3

或者一个高维的张量,虽然两者的trailing axes的不同,但是有一个维数是1,所以可以进行BROADCAST:

      A      (4d array):  8 x 1 x 6 x 1
      B      (3d array):      7 x 1 x 5
      Result (4d array):  8 x 7 x 6 x 5

几个例子:

from numpy import array

a = array([[0.0, 0.0, 0.0],
           [10.0, 10.0, 10.0],
           [20.0, 20.0, 20.0],
           [30.0, 30.0, 30.0]])

b = array([1., 2., 3.])

print(a + b)

输出结果:

[[ 1.  2.  3.]
 [11. 12. 13.]
 [21. 22. 23.]
 [31. 32. 33.]]

伸展过程如下:

下面这种就不能通过:

另一种方式:

from numpy import array, newaxis
a = array([0.0,10.0,20.0,30.0])
b = array([1.0,2.0,3.0])
print(a[:,newaxis] + b)

输出结果:

[[ 1.  2.  3.]
 [11. 12. 13.]
 [21. 22. 23.]
 [31. 32. 33.]]

伸展过程:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值