【Python】Numpy 笔记 1
In [1]:
import numpy as np
In [3]:
# 生成随机数
data = np.random.randn(2, 3)
print(data)
In [4]:
# ndarray 计算
# ndarray * factor
print(data * 10)
In [5]:
# ndarray + ndarray
print(data + data)
tmp = np.random.randn(2, 3)
print(tmp)
print(data + tmp)
In [6]:
# 数组大小 和 数据类型
print("data 维数:", data.shape)
print("data 元素数据类型:", data.dtype)
In [7]:
# 创建 ndarray
arr1 = [1, 2, 3, 4, 5, 6]
narr1 = np.array(arr1)
print(narr1)
In [8]:
arr2 = [
[1, 2, 3, 4, 5],
[5, 4, 3, 2, 1],
[6, 7, 8, 9, 10]
]
narr2 = np.array(arr2)
print(narr2)
print("narr2 维数: ", narr2.shape)
print("narr2 元素类型: ", narr2.dtype)
In [11]:
# 维度 即 一维 二维 三维
print("narr2 维度:", narr2.ndim)
narr3 = np.random.randn(2, 3, 4)
print(narr3)
print("narr3 维度: ", narr3.ndim)
In [28]:
'''
zeros 创建一个元素全为 0 的 ndarray
ones 创建一个元素全为 1 的 ndarray
empty 创建一个元素值不确定的 narray
'''
print(np.zeros((2, 3)))
print(np.ones((2, 3)))
print(np.empty((2, 3, 3)))
其他创建ndarray的方法¶
ndarray 元素的数据类型¶
In [31]:
# 使用 array 创建 ndarray 时指定元素数据类型
narr3 = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print(narr3.dtype)
In [36]:
# 使用 astype 方法进行强转
narr4 = np.array([1, 2, 3, 4])
print(narr4.dtype)
narr4 = narr4.astype(np.float64)
print(narr4)
print(narr4.dtype)
数组的运算¶
In [37]:
narr5 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(narr5 * narr5) # 乘法
print(narr5 - narr5) # 减法
print(narr5 / narr5) # 除法
print(1 / narr5) # ?? 除法
print(narr5 / 2) # ?? 除法
In [38]:
narr6 = np.array([[2, 3, 1, 4], [3, 4, 6,10]])
print(narr6 > narr5)
数组的广播¶
如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。
如果满足以下规则,可以进行广播:
ndim较小的数组会在前面追加一个长度为 1 的维度。
输出数组的每个维度的大小是输入数组该维度大小的最大值。
如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则可以在计算中使用该输入。
如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算。
如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。
数组拥有相同形状。
数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。
数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。
In [42]:
narr7 = np.array([1, 2, 3])
print("narr7: ", narr7)
narr8 = np.array([[3, 2, 1], [3, 4, 5]])
print("narr8: ", narr8)
In [43]:
print(narr8 - narr7)
索引和切片¶
In [44]:
narr9 = np.arange(8)
print(narr9)
print(narr9[4]) # 第五个元素
In [45]:
# 第 5-8个元素, [4:8] 为 [4:8), narr9[4], narr9[5], narr9[6], narr9[7]
print(narr9[4:8])
In [47]:
# 集体赋值
narr9[2:5] = 10
print(narr9)
切片索引属于引用传递¶
将切片赋值给一个变量时,修改其中一个值,将在两个数组同时生效
In [48]:
narr10 = narr9[2:5]
print(narr10)
narr10[0] = 2333
print(narr10)
print(narr9)
In [49]:
# [:] 表示所有元素
narr9[:] = 3444
print(narr9)
print(narr10)
In [51]:
#对多维数组
narr11 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(narr11)
print(narr11[1][3])
print(narr11[1, 3])
In [52]:
print(narr11[1])
In [53]:
print(narr11[1, :3])
In [58]:
print(narr11[:1, 1:4])
布尔型索引¶
In [59]:
boolArr = np.array([True, True, False, False])
numArr = np.random.randn(4, 6)
print(boolArr)
print(numArr)
print(numArr[boolArr])
花式索引¶
In [63]:
narr = np.empty((6, 5))
for i in range(6):
narr[i] = i
print(narr)
print(narr[[3, 2, 0, 5]]) # 依次输出第3、2、0、5行
数组转置和轴对换¶
In [64]:
narr = np.arange(24).reshape((4, 6))
print(narr)
print(narr.T)
In [65]:
print(np.dot(narr, narr.T)) # 计算矩阵内积
In [67]:
print(narr.transpose())
In [69]:
# 对于高维数组,需要指定转置的轴
narr = np.arange(36).reshape((3, 4, 3))
print(narr)
print("****************** 转置后 *********************")
print(narr.transpose(1, 0, 2))
元素级别通用函数¶
In [74]:
narr = np.arange(12).reshape((3, 4))
print(narr)
print("******** sqrt 开方 ***********")
print(np.sqrt(narr)) # 相当于 narr ** 0.5
print("******** square 平方 ***********")
print(np.square(narr)) # 相当于 narr **2
print("******** exp ***********")
print(np.exp(narr))
print("******** maximum 取大 ***********")
narr1 = np.random.randn(3, 4)
print("narr1:", narr1)
narr2 = np.random.randn(3, 4)
print("narr2: ", narr2)
print("maximum 结果: ", np.maximum(narr1, narr2))
In [75]:
# 使用参数进行接收
print(narr)
np.square(narr, narr)
print(narr)
In [ ]:
欢迎访问我的个人博客站点:
https://yeyeck.com