Numpy 4

简单的 Numpy Broadcasting

更多干货


Broadcasting(广播) 解决的是不同形状的矩阵(或者向量)之间的运算问题。

在代数运算中,不同形状的矩阵(或者向量)之间无法进行基本运算,但是在Numpy中,只要满足一般规则,这个运算的允许的。

In [ ]:
import numpy as np

向量和一个数字相加

a = [a1, a2, a3]
b

c = a + b
c = [a1 + b, a2 + b, a3 + b]
In [ ]:
a = np.array([1, 2, 3])
b = 2
a + b

二维数组和一个数字相加

A = [[a11, a12, a13],
     [a21, a22, a23]]
b

C = A + b
C = [[a11 + b, a12 + b, a13 + b],
     [a21 + b, a22 + b, a23 + b]]
In [ ]:
A = np.array([[1, 2, 3],
             [1, 2, 3]])
b = 2
C = A + b
C

二维数组和一维数组相加

A = [[a11, a12, a13],
     [a21, a22, a23]]
b = [b1, b2, b3]

C = A + b
C = [[a11 + b1, a12 + b2, a13 + b3],
     [a21 + b1, a22 + b2, a23 + b3]]
In [ ]:
A = np.array([[1, 2, 3],
              [1, 2, 3]])
b = np.array([1, 2, 3])
C = A + b
C

Broadcasting的基本原则

整体而言,两个不同形状的矩阵(或者向量)进行基本运算,看两个矩阵(或者向量)的倒序维数。如果倒序维数是一致的,则“小矩阵”经过复制扩展,和“大矩阵”进行基本运算。

比如:

A.shape = (2 x 3)  ->  A.shape = (2 x 3)
b.shape = (3)      ->  b.shape = (1 x 3)

A.shape = (2 x 3)  ->  A.shape = (2 x 3)
b.shape = (1)      ->  b.shape = (1 x 1)

但是,在以下例子中,b无法broadcasting后和A进行运算

A.shape = (2 x 3)
b.shape = (1 x 2)
In [ ]:
A = np.array([[1, 2, 3],
              [1, 2, 3]])
b = np.array([1, 2])
C = A + b
C

Numpy 的结构化数据

In [ ]:
name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]

创建无结构化的数据

In [ ]:
import numpy as np

x = np.zeros(4, dtype=np.int)
x

创建结构化数据,dtype是一个字典,包括names和formats

In [ ]:
import numpy as np

data = np.zeros(4, dtype={'names':('name', 'age', 'weight'),
                          'formats':('U10', 'i4', 'f8')})
print(data.dtype)
In [ ]:
data['name'] = name
data['age'] = age
data['weight'] = weight 
print(data)
In [ ]:
data['name']
In [ ]:
data['age'].mean()
In [ ]:
data['weight'].max()
In [ ]:
data[data['age'] < 30]['name']

使用元组创建结构化数据

In [ ]:
data2 = np.zeros(4, dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f8')])
print(data2.dtype)
In [ ]:
data2['name'] = name
data2['age'] = age
data2['weight'] = weight 
print(data2)

RecordArray

和structured array一样,但是属性(列向量)可以直接使用[.属性名]的方式访问

In [ ]:
data_rec = data.view(np.recarray)
data_rec.age

方便,但效率稍低

In [ ]:
%timeit data['age']
%timeit data_rec['age']
%timeit data_rec.age

更多数据探索

In [ ]:
from sklearn import datasets

MNIST数据集

In [ ]:
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata('MNIST original')
In [ ]:
mnist.data.shape
In [ ]:
mnist.target.shape
In [ ]:
mnist.data[:10]
In [ ]:
mnist.data[0]
In [ ]:
import matplotlib
import matplotlib.pyplot as plt

digit = mnist.data[0]
digit_image = digit.reshape(28, 28)

plt.imshow(digit_image, cmap=matplotlib.cm.binary)
plt.axis("off")
plt.show()
In [ ]:
mnist.target[0]



猜你喜欢

转载自blog.csdn.net/qq_27384769/article/details/80914789
今日推荐