Numpy学习

Data100-Numpy_Review学习:

Importing Numpy

import numpy as np

Creating Arrays

# 使用1个list对象来创建array
A = np.array([[1,2],[3,4]])				# 方式1
B = np.array([x for x in range(5)])		# 方式2

# 上述array中的元素都是数值元素

# 也可以是字符、字符串
C = np.array([['A','B'],['C','D'],['E','F']])
# 使用库自带的方法(.zeros()、.ones()、.eye())来创建array

# 所有元素值都为0
A = np.zeros(5)
B = np.zeros([5,2])

# 所有元素值都为1
C = np.ones(5)
D = np.ones([5,2])

# 创建单位矩阵
E = np.eye(4)
# 使用库自带的方法(.arange())来创建array
A = np.arange(0, 8, 3)			# [) 左闭右开,步长
B = np.linspace(1, 5, 10)		# [] 左闭右闭,步长=(5-1)/(10-2-1)

Random array

# 正态分布:
A = np.random.randn(3,2)
B = np.random.randn(2)

# 均匀分布:
C = np.random.rand(3,2)
D = np.random.rand(2)

# 将输入序列-range对象,打乱顺序
E = np.random.permutation(range(1,8))

Properties of Arrays

# shape
A = np.array([[1,2],[3,4]])	
print(A.shape)

# type	array的元素类型
print(A.dtype)
# 改变array的类型 .astype()
B = A.astype(float)
print(B.dtype)
# Polymorphism array的元素类型不唯一
C = np.array([1, 2, 'HelloChina', 2., True])
C[0]='A'		# 可行
C[1]='ABC'		# 可行
# 在执行替换前,输出C,发现其元素全部变成了str类型

D=np.array([1,2,3,4.])
# 在执行替换前,输出D,发现其元素全部都是float类型
D[0]='A'		# 报错

Jagged Arrays

Reshaping

A = np.arange(1,13)
B = A.reshape(3,4)			# 3row,4col,从左到右、从上到下
# 等价于:B = A.reshape(3,4,order='C')

C = A.reshape(3,4,order='F') # 3row,4col,从上到下,从左到右

Flatting Martix

A = np.array([[1,2],[3,4],[5,6],[7,8]])
B = A.flatten()

Array Representation

A = np.arange(1,13)
B = A.reshape(3,4,order='C')
print(B.dtype)			# 得到int32:4个字节
print(B.data.tobytes())
'''得到
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00'
'''
C = A.reshape(3,4,order='F')
print(C.dtype)			# 得到int32:4个字节
print(C.data.tobytes())
'''得到
b'\x01\x00\x00\x00\x04\x00\x00\x00\x07\x00\x00\x00\n\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x08\x00\x00\x00\x0b\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00'
# 综上所述:计算机存储是从左到右,从上到下的
'''

Slicing

# 逗号左边为行、右边为列
# 行和列的语法都为:    begin:end:stride
x=np.arange(1,13).reshape(3,4)

# 索引
x[0:, 0]	# array([1, 5, 9])
x[0, :]		# array([1, 2, 3, 4])
x[:2, 1:]	# array([[2, 3, 4],[6, 7, 8]])
x[0::2, :]	# array([[ 1,  2,  3,  4],[ 9, 10, 11, 12]])

# 修改
x[:2, 2:]=0	# 右上角
'''修改后的x:
[[ 1  2  0  0]
 [ 5  6  0  0]
 [ 9 10 11 12]]
'''

Boolean Indexing

A=np.array([[1.,2,3],[4,5,-999],[7,8,9],[10,-999,-999]])
print(A>3)
''' 得到
[[False False False]
 [ True  True False]
 [ True  True  True]
 [ True False False]]
'''

print(A[A>3])
''' 得到
[ 4.  5.  7.  8.  9. 10.]
'''

isnumequal= (A==-999)
A[isnumequal]=np.nan	# 将A中等于-999的元素,替换成np.nan
print(np.mean(A))	# 得到nan

print(np.nanmean(A))	# 得到:(1+2+3+4+5+7+8+9+10)/9

print(np.nanmean(A,axis=0))		# 得到[5.5 5.  6. ]--按行的方向来
print(np.nanmean(A,axis=1))		# 得到[ 2.   4.5  8.  10. ]--按列的方向来

More Complex Bit Logic

# 例子1:计算staff元素(人名)对应的favorite_number值之和
names = np.array(["Joey", "Henry", "Joseph", 
                  "Jim", "Sam", "Deb", "Mike", 
                  "Bin", "Joe", "Andrew", "Bob"])
favorite_number=np.arange(len(names))	# 得得:[ 0  1  2  3  4  5  6  7  8  9 10]
staff = ["Joey",  "Deb", "Sam"]

'''使用循环的方法'''
total=0
for i in range(len(names)):
    if names[i] in staff:
        total+=favorite_number[i]
print(total)

'''使用np.in1d()方法'''
isstaff=np.in1d(names,staff)
print(favorite_number[isstaff].sum())

# 例子2:arrays的元素为Boolean类型时,求mean()
starts_with_j = np.char.startswith(names, "J")

print(starts_with_j)
# 得到:[ True False  True  True False False False False  True False False]

print(isstaff)
# 得到:[ True False False False  True  True False False False False False]

print(starts_with_j[is_staff].mean()) # (True+False+False)/3=(1+0+0)/3

A Note on using Array operations

# 得到一个arrays,其中有十个元素,都为随机值,求其大于0.5元素的平均值
'''方法1'''
data = np.random.rand(10)
sum=0
num=0
for x in data:
    if x>0.5:
        sum+=x
        num+=1
print(sum/num)

'''方法2:Clearer、Faster'''
data = np.random.rand(10)
result=data[data > 0.5].mean()
print(result)

Mathematical Operations

# 注意Floating Point Numbers,只能近似,不会完全相等

print(0.1 + 0.2 == 0.3)		# 得到False

'''使用np.isclose()来判断浮点数是否相近
参数:np.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
|a-b|<=atol+rtol*|b|则为True
equal_nan==True时,则认为np.nan之间是相等的
'''
# 按行方向求和:.sum(axis=0)
# 按列方向求和:.sum(axis=1)

Linear Algebra

# 矩阵之间用*来进行乘法:这个是逐元素乘法,可能会引起broadcast机制
# 实现线性代数中矩阵乘法:
.dot()
@ 
# 矩阵求逆:
from numpy.linalg import inv
inv()

from numpy.linalg import solve
solve(, )
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值