- 可以像标量计算一样计算数组
- 在一个ndarray里,每一个元素都是相同类型
- 每一个数组都有一个属性
shape
,dtype
,ndim
import numpy as np
创建Numpy
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
arr1
array([6., 7.5, 8., 0., 1.])
print(arr1.shape)
print(arr1.ndim)
print(arr1.dtype)
(5,)
1
float64
全0 / 全1 / 全空(垃圾值)
zero_2_3 = np.zeros((2, 3))
print(zero_2_3)
[[0. 0. 0.]
[0. 0. 0.]]
one_1_3 = np.ones((1, 3))
print(one_1_3)
[[1. 1. 1.]]
empty_2_3_2 = np.empty((2, 3, 2))
print(empty_2_3_2)
[[[3.10503618e+231 3.10503618e+231]
[1.03753786e-322 0.00000000e+000]
[0.00000000e+000 0.00000000e+000]]
[[0.00000000e+000 0.00000000e+000]
[0.00000000e+000 0.00000000e+000]
[0.00000000e+000 0.00000000e+000]]]
np.arange( )
- 数组版
range( )
arange_ = np.arange(10)
print(arange_)
[0 1 2 3 4 5 6 7 8 9]
数组的类型变化
- np.astype( )
- 可以将string变成numeric
num_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
num_strings = num_strings.astype(float)
num_strings
array([ 1.25, -9.6 , 42. ])
Numpy的数组算数
- 任何两个等尺寸的数组之间的算术 *** 作都是
逐元素
的 - 带有
标量
的,都会 *** 作与每一个元素,例如1/M - 同尺寸数组比较,就是
bool *** 作
,也会逐个比较
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr * arr
array([[ 1, 4, 9],
[16, 25, 36]])
arr - arr
arr ** arr
arr / arr
1 / arr
arr ** 0.5
array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974]])
arr2 = np.array([[2, 1, 6],[3, 0, 2]])
arr2 > arr
array([[ True, False, True],
[False, False, False]])
索引与切片
- 切片被切出来以后,是一个
视图
,就是俗话说的指针,改变切出来的值也会改变原来
的变量 - 若真的想要一个
拷贝
,而不是一个视图,就需要使用.copy()
arr3 = np.array([1, 2, 3, 4, 5, 6, 7])
arr3
array([1, 2, 3, 4, 5, 6, 7])
arr3_slice = arr3[2:5]
arr3_slice
array([3, 4, 5])
arr3_slice[1] = 100
print(arr3_slice)
print(arr3)
[ 3 100 5]
[ 1 2 3 100 5 6 7]
arr3[4:6] = 99
print(arr3)
print(arr3_slice)
[ 1 2 3 100 99 99 7]
[ 3 100 99]
# .copy()
arr3_copy = arr3[3:5].copy()
arr3_copy
array([100, 99])
索引
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 两种方式都可以
print(arr_2d[0][1])
print(arr_2d[1, 0])
2
4
索引 + 切片
empty_2_3_2
array([[[3.10503618e+231, 3.10503618e+231],
[1.03753786e-322, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000]],
[[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000]]])
empty_slice_index = empty_2_3_2[0,0:2]
empty_slice_index
array([[3.10503618e+231, 3.10503618e+231],
[1.03753786e-322, 0.00000000e+000]])
BOOL索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
print(names)
print(data)
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
[[-0.76653514 0.1674464 2.04743708 0.80417589]
[ 0.94516431 -1.45891232 -0.49894545 1.13276983]
[ 0.52359465 0.52882966 0.10846199 -0.31576578]
[ 1.72629058 0.30659678 0.30496955 0.19905612]
[ 1.11259468 1.07077902 -0.48850304 -0.62000457]
[ 0.85144135 -0.0565551 -1.35784127 0.03526461]
[ 0.26994239 -0.04985369 -1.13525461 -0.62994759]]
names == 'Bob'
array([ True, False, False, True, False, False, False])
data[names == 'Bob', 2:]
array([[2.04743708, 0.80417589],
[0.30496955, 0.19905612]])
data[names == 'Bob', 3]
array([0.80417589, 0.19905612])
神奇索引
arr = np.empty((8, 4))
for i in range(8):
# 一次变一行
arr[i] = i
arr
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
开始索引
magic_1 = arr[[2, 3, 5]]
magic_1
array([[2., 2., 2., 2.],
[3., 3., 3., 3.],
[5., 5., 5., 5.]])
magic_2 = arr[[-1, -4, -6]]
magic_2
array([[7., 7., 7., 7.],
[4., 4., 4., 4.],
[2., 2., 2., 2.]])
当面临多维时
arr = np.arange(32).reshape((8, 4))
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
magic_3 = arr[[2, 3, 6],[1, 3, 2]]
magic_3
array([2., 3., 6.])
转置和内积
np.dot
np.T
arr = np.arange(15).reshape((5, 3))
arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
arr_T = arr.T
arr_T
array([[ 0, 3, 6, 9, 12],
[ 1, 4, 7, 10, 13],
[ 2, 5, 8, 11, 14]])
Dot = np.dot(arr_T, arr)
Dot
array([[270, 300, 330],
[300, 335, 370],
[330, 370, 410]])
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)