第二章:25+ Python 数据操作教程(第十三节NUMPY 教程与练习)

122 阅读11分钟

 NumPy(“Numerical Python”或“Numeric Python”的缩写)是 Python 中对数组和矩阵进行快速数学计算的最基本的软件包之一。在处理多维数据时它也非常有用。集成C、C++和FORTRAN工具是一件幸事。它还提供了许多傅里叶变换 (FT) 和线性代数函数。

为什么使用 NumPy 而不是列表?

人们可能会想到为什么我们应该更喜欢 NumPy 中的数组,而不是我们可以创建具有相同数据类型的列表。如果这句话也引起了你的注意,那么以下原因可能会说服你:

 

  1. Numpy 数组具有连续的内存分配。因此,如果将相同的数组存储为列表,则与数组相比将需要更多的空间。
  2. 它们的使用速度更快,因此比列表更高效。
  3. 他们打交道更方便。

 

NumPy 与 Pandas

Pandas 构建在 NumPy 之上。换句话说,pandas 需要 Numpy 才能使其工作。所以 Pandas 并不是 Numpy 的替代品。相反,pandas 提供了额外的方法或提供了在 Python 中处理数字和表格数据的更简化的方式。

导入numpy

首先,您需要导入 numpy 库。可以通过运行以下命令来导入 numpy:

将 numpy 导入为 np

这是导入 numpy 的通用方法,别名为“np”。如果未提供别名,那么要从 numpy 访问函数,我们将编写numpy.function。为了方便起见,引入了别名“np”,以便我们可以编写np.function。下面列出了 numpy 的一些常用函数 -

功能任务
大批创建 numpy 数组
这就是我数组的维数
形状数组的大小(行数和列数)
尺寸数组中元素的总数
数据类型数组中元素的类型,即int64、character
重塑在不改变原始形状的情况下重塑数组
调整大小重塑数组。也改变原来的形状
排列在数组中创建数字序列
商品尺寸每个项目的大小(以字节为单位)
诊断创建对角矩阵
虚拟堆栈垂直堆叠
水平堆叠

一维数组 使用 numpy 可以使用np.array
创建数组:

a = np.array([15,25,14,78,96])
a
print(a)

a
Output: array([15, 25, 14, 78, 96])

print(a)
Output: [15 25 14 78 96]

请注意,np.array 中存在方括号。缺少方括号会导致错误。要打印数组,我们可以使用print(a)

更改数据类型 np.array( ) 有一个附加的dtype
参数,通过该参数可以定义元素是整数、浮点还是复数。

a.dtype
a = np.array([15,25,14,78,96],dtype = "float")
a
a.dtype

最初 'a' 的数据类型是 'int32' ,修改后变为 'float64'

  1. int32指的是没有小数点的数字。'32' 表示数字可以在 -2147483648 和 2147483647 之间。类似地,int16 表示数字可以在 -32768 到 32767 范围内

  2. float64指的是带有小数位的数字。

创建数字序列
如果您想创建数字序列,那么使用np.arange, 我们可以获得我们的序列。要获取从 20 到 29 的数字序列,我们运行以下命令。

b = np.arange(start = 20,stop = 30, step = 1)
b

array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29])

在np.arange中,终点始终被排除。

np.arange提供了一个步长选项,它定义了两个连续数字之间的差异。如果未提供步骤,则默认采用值 1。

假设我们要创建一个初始项为 20、公差为 2 的等差级数30 被排除在外。

c = np.arange(20,30,2) #30 is excluded.
c

array([20, 22, 24, 26, 28])

需要注意的是,在 np.arange( ) 中,stop 参数始终被排除。

数组中的索引
需要注意的是,Python 索引从 0 开始。索引的语法如下 -

  1. x[start:end:step] :数组 x 中的元素从开始到结束(但不包括结束),默认步长值为 1。

  2. x[start:end] :数组 x 中的元素从开始到结束(但不包括结束)

  3. x[start:] :元素从末尾开始

  4. x[:end] :从开头到结尾的元素(但不包括结尾)

如果我们想提取第三个元素,我们将索引写为 2,因为它从 0 开始。

x = np.arange(10)
x[2]
x[2:5]
x[::2]
x[1::2]

x
Output: [0 1 2 3 4 5 6 7 8 9]

x[2]
Output: 2

x[2:5]
Output: array([2, 3, 4])

x[::2]
Output: array([0, 2, 4, 6, 8])

x[1::2]
Output: array([1, 3, 5, 7, 9])

请注意,在x[2:5] 中,选择从第 2 个索引开始到第 5 个索引(不包括)的元素
如果我们想要更改从索引 7 开始到索引 7(不包括 7)的所有元素的值,步长为 3,即 123,我们可以这样写:

x[:7:3] = 123
x

array([123,   1,   2, 123,   4,   5, 123,   7,   8,   9])

为了反转给定的数组,我们编写:

x = np.arange(10)
x[ : :-1] # reversed x

array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

请注意,上述命令不会修改原始数组。

重塑数组

要重塑数组,我们可以使用reshape()。

f = np.arange(101,113)
f.reshape(3,4)
f

 array([101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112])

请注意,reshape() 不会改变原始数组的形状。因此,要修改原始数组,我们可以使用resize( )

f.resize(3,4)
f

array([[101, 102, 103, 104],
       [105, 106, 107, 108],
       [109, 110, 111, 112]])

如果在重塑中将某个维度指定为 -1,则只要给定维度是数组中元素总数的倍数,就会自动计算其他维度。

f.reshape(3,-1)

array([[101, 102, 103, 104],
       [105, 106, 107, 108],
       [109, 110, 111, 112]])

在上面的代码中,我们只指定了 3 行。Python 自动计算其他维度的元素数量,即 4 列。

缺失数据

缺失的数据由 NaN(Not a Number 的缩写)表示。您可以使用命令np.nan

val = np.array([15,10, np.in , 3, 2, 5, 6, 4])

val.sum()
Out: nan

要忽略缺失值,可以使用np.nansum(val) ,它返回 45

要检查数组是否包含缺失值,可以使用函数isnan( )

np.isnan(val)

2D 数组
numpy 中的 2D 数组可以通过以下方式创建:

g = np.array([(10,20,30),(40,50,60)])
#或者
g = np.array([[10,20,30],[40,50,60]])
G

维度、元素总数和形状可以分别通过ndim、sizeshape确定:

g.ndim
g.size
g.shape

g.ndim
Output: 2

g.size
Output: 6

g.shape
Output: (2, 3)

创建一些常用矩阵

numpy 提供了创建一些常用于线性代数的常用矩阵的实用程序。

要创建 2 行 4 列全零矩阵,我们可以使用np.zeros( )

np.zeros( (2,4) )

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

这里还可以指定 dtype。对于零矩阵,默认数据类型是“float”。要将其更改为整数,我们编写 “dtype = np.int16”

np.zeros([2,4],dtype=np.int16)

array([[0, 0, 0, 0],
       [0, 0, 0, 0]], dtype=int16)

为了获得从 0 到 1 的所有随机数的矩阵,我们编写np.empty。

np.empty( (2,3) )

array([[  2.16443571e-312,   2.20687562e-312,   2.24931554e-312],
       [  2.29175545e-312,   2.33419537e-312,   2.37663529e-312]])

注意:每次运行 np.empty 时结果可能会有所不同
为了创建统一矩阵,我们编写np.ones( ) 。我们可以通过以下方式创建一个全为 3 * 3 的矩阵:

np.ones([3,3])

array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

要创建对角矩阵,我们可以编写np.diag( ) 。要创建对角线元素为 14、15、16 和 17 的对角矩阵,我们编写:

np.diag([14,15,16,17])

array([[14,  0,  0,  0],
       [ 0, 15,  0,  0],
       [ 0,  0, 16,  0],
       [ 0,  0,  0, 17]])

要创建单位矩阵,我们可以使用np.eye( )

np.eye(5,dtype = "int")

array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])

默认情况下,np.eye() 中的数据类型是“float”,因此我们编写 dtype = "int" 将其转换为整数。

重塑 2D 数组
要获得展平的 1D 数组,我们可以使用ravel( )

g = np.array([(10,20,30),(40,50,60)])
g.ravel()

array([10, 20, 30, 40, 50, 60])

要改变二维数组的形状,我们可以使用reshape。写入-1会自动计算另一个维度,并且不会修改原始数组。

g.reshape(3,-1) # 返回形状修改后的数组

它不会修改原始数组

g.shape

(2, 3)

与一维数组类似,使用resize( ) 将修改原始数组中的形状。

g.resize((3,2))
g #resize修改原数组

array([[10, 20],
       [30, 40],
       [50, 60]])

是时候学习一些矩阵代数了

让我们创建一些数组 A、b 和 B,它们将用于本节:

A = np.array([[2,0,1],[4,3,8],[7,6,9]])
b = np.array([1,101,14])
B = np.array( [[10,20,30],[40,50,60],[70,80,90]])

为了获得转置、迹和逆,我们分别使用A.transpose( ) 、 np.trace( )np.linalg.inv( ) 。

A.T #transpose
A.transpose() #transpose
np.trace(A) # trace
np.linalg.inv(A) #Inverse

A.transpose()  #transpose
Output: 
array([[2, 4, 7],
       [0, 3, 6],
       [1, 8, 9]])

np.trace(A)  # trace
Output: 14

np.linalg.inv(A)  #Inverse
Output: 
array([[ 0.53846154, -0.15384615,  0.07692308],
       [-0.51282051, -0.28205128,  0.30769231],
       [-0.07692308,  0.30769231, -0.15384615]])

请注意,转置不会修改原始数组。

矩阵加法和减法可以用通常的方式完成:

A+B
A-B

A+B
Output: 
array([[12, 20, 31],
       [44, 53, 68],
       [77, 86, 99]])

A-B
Output: 
array([[ -8, -20, -29],
       [-36, -47, -52],
       [-63, -74, -81]])

A 和 B 的矩阵乘法可以通过 A.dot(B) 完成。其中 A 将是左侧的第一个矩阵,B 将是右侧的第二个矩阵。

A.点(B)

array([[  90,  120,  150],
       [ 720,  870, 1020],
       [ 940, 1160, 1380]])

为了求解线性方程组:Ax = b,我们使用np.linalg.solve( )

np.linalg.solve(A,b)

array([-13.92307692, -24.69230769,  28.84615385])

特征值和特征向量可以使用np.linalg.eig( ) 计算

np.linalg.eig(A)

(array([ 14.0874236 ,   1.62072127,  -1.70814487]),
 array([[-0.06599631, -0.78226966, -0.14996331],
        [-0.59939873,  0.54774477, -0.81748379],
        [-0.7977253 ,  0.29669824,  0.55608566]]))

第一行是各种特征值,第二个矩阵表示特征向量矩阵,其中每一列是对应特征值的特征向量。

一些数学函数

我们可以使用 numpy 得到各种三角函数,如正弦、余弦等:

B = np.array([[0,-20,36],[40,50,1]])
np.sin(B)

array([[ 0.        , -0.91294525, -0.99177885],
       [ 0.74511316, -0.26237485,  0.84147098]])

结果是所有 sin( ) 元素的矩阵。
为了获得指数,我们使用 ******

B**2

array([[   0,  400, 1296],
       [1600, 2500,    1]], dtype=int32)

我们得到 B 的所有元素的平方矩阵。
为了获得矩阵的元素是否满足条件,我们需要编写条件。例如,要检查 B 的元素是否超过 25,我们编写:

B>25

array([[False, False,  True],
       [ True,  True, False]], dtype=bool)

我们得到一个布尔矩阵,其中 True 表示相应元素大于 25,False 表示不满足条件。
以类似的方式,np.absolute、np.sqrtnp.exp分别返回绝对数、平方根和指数的矩阵。

np.absolute(B)
np.sqrt(B)
np.exp(B)

现在我们考虑形状为 3*3 的矩阵 A:

A = np.arange(1,10).reshape(3,3)
A

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

为了分别求总和、最小值、最大值、平均值、标准差和方差,我们使用以下命令:

A.sum()
A.min()
A.max()
A.mean()
A.std() #标准差
A.var() #方差

A.sum()
Output: 45

A.min()
Output: 1

A.max()
Output: 9

A.mean()
Output: 5.0

A.std()   #Standard deviation
Output: 2.5819888974716112

A.var()
Output: 6.666666666666667

为了获得最小和最大元素的索引,我们分别使用argmin()argmax() 。

A.argmin()
A.argmax()

A.argmin()
Output: 0

A.argmax()
Output: 8

如果我们希望找到每一行或每一列的上述统计信息,那么我们需要指定轴:

A.sum(轴=0)
A.mean(轴=0)
A.std(轴=0)
A.argmin(轴=0)

A.sum(axis=0)                 # sum of each column, it will move in downward direction
Output: array([12, 15, 18])

A.mean(axis = 0)
Output: array([ 4.,  5.,  6.])

A.std(axis = 0)
Output: array([ 2.44948974,  2.44948974,  2.44948974])

A.argmin(axis = 0)
Output: array([0, 0, 0], dtype=int64)

通过定义axis = 0, 计算将向下移动,即它将给出每列的统计数据。为了找到每行的最小值和最大元素的索引,我们需要向右移动,所以我们写axis = 1

A.min(轴=1)
A.argmax(轴=1)

A.min(axis=1)                  # min of each row, it will move in rightwise direction
Output: array([1, 4, 7])

A.argmax(axis = 1)
Output: array([2, 2, 2], dtype=int64)

为了找到每行的累积和,我们使用cumsum( )

A.cumsum(轴=1)

array([[ 1,  3,  6],
       [ 4,  9, 15],
       [ 7, 15, 24]], dtype=int32)

创建 3D 数组
Numpy 还提供创建 3D 数组的工具。3D 数组可以创建为:

X = np.array( [[[ 1, 2,3],
[ 4, 5, 6]],
[[7,8,9],
[10,11,12]]])
X.shape
X.ndim
X尺寸

X 包含两个 2D 数组,因此形状为 2,2,3。元素总数为 12。
为了计算沿特定轴的总和,我们使用 axis 参数,如下所示:

X.sum(轴 = 0)
X.sum(轴 = 1)
X.sum(轴 = 2)

X.sum(axis = 0)
Output: 
array([[ 8, 10, 12],
       [14, 16, 18]])

X.sum(axis = 1)
Output: 
array([[ 5,  7,  9],
       [17, 19, 21]])

X.sum(axis = 2)
Output: 
array([[ 6, 15],
       [24, 33]])

axis = 0 返回每个二维数组对应元素的总和。axis = 1 返回每个矩阵中每列元素的总和,而 axis = 2 返回每个矩阵中每行元素的总和。

X.ravel()

 array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

ravel( ) 将所有元素写入单个数组中。
考虑一个 3D 数组:

X = np.array( [[[ 1, 2,3],
[ 4, 5, 6]],
[[7,8,9],
[10,11,12]]])

为了提取第二个矩阵,我们编写:

X[1,...] # 与 X[1,:,:] 或 X[1] 相同

array([[ 7,  8,  9],
       [10, 11, 12]])

请记住,Python 索引从 0 开始,这就是为什么我们编写 1 来提取第二个二维数组。
要从我们编写的所有行中提取第一个元素:

X[...,0] # 与 X[:,:,0] 相同

array([[ 1,  4],
       [ 7, 10]])

找出满足给定条件的元素的位置

a = np.array([8, 3, 7, 0, 4, 2, 5, 2])
np.where(a > 4)

array([0, 2, 6]

np.where定位数组中数组元素大于 4 的位置。

使用索引数组进行索引
考虑一维数组。

x = np.arange(11,35,2)
x

array([11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33])

我们形成一个一维数组 i,它对 x 的元素进行子集化,如下所示:

i = np.array( [0,1,5,3,7,9 ] )
x[i]

array([11, 13, 21, 17, 25, 29])

以类似的方式,我们创建一个 2D 数组 j,其索引为子集 x。

j = np.array( [ [ 0, 1], [ 6, 2 ] ] )
x[j]

array([[11, 13],
       [23, 15]])

类似地,我们可以将 i 和 j 创建为 x 的索引的二维数组

x = np.arange(15).reshape(3,5)
x
i = np.array( [ [0,1], # 第一个暗淡的索引
[2,0] ] )
j = np.array( [ [ 1,1], # 第二个暗淡的索引
[2,0] ] )

为了获取行中的第 i 个索引和列的第 j 个索引,我们编写:

x[i,j] # i 和 j 必须具有相同的形状

array([[ 1,  6],
       [12,  0]])

要从第三列中提取第 i 个索引,我们编写:

x[i,2]

array([[ 2,  7],
       [12,  2]])

对于每一行,如果我们想找到第 j 个索引,我们可以这样写:

x[:,j]

array([[[ 1,  1],
        [ 2,  0]],

       [[ 6,  6],
        [ 7,  5]],

       [[11, 11],
        [12, 10]]])

固定第 1 行和第 j 个索引,固定第 2 行第 j 个索引,固定第 3 行和第 j 个索引。

您还可以使用数组索引来分配值:

x = np.arange(10)
x
x[[4,5,8,1,2]] = 0
x

array([0, 0, 0, 3, 0, 0, 6, 7, 0, 9])

0 被分配给 x 的第 4、5、8、1 和 2 个索引。
当索引列表包含重复项时,它将最后一个值分配给该索引:

x = np.arange(10)
x
x[[4,4,2,3]] = [100,200,300,400]
x

array([  0,   1, 300, 400, 200,   5,   6,   7,   8,   9])

请注意,对于第 5 个元素(即第 4 个索引),分配的值是 200,而不是 100。
注意:如果对重复索引使用 += 运算符,则它仅对重复索引执行一次运算符。

x = np.arange(10)
x[[1,1,1,7,7]]+=1
x

 array([0, 2, 2, 3, 4, 5, 6, 8, 8, 9])

虽然索引 1 和 7 重复,但它们仅递增一次。

使用布尔数组索引
我们创建一个 2D 数组并将条件存储在 b 中。如果条件为真,则结果为 True,否则为 False。

a = np.arange(12).reshape(3,4)
b = a > 4
b

array([[False, False, False, False],
       [False,  True,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)

请注意,“b”是一个布尔值,其形状与“a”相同。
要从“a”中选择符合条件“b”的元素,我们编写:

一个[b]

array([ 5,  6,  7,  8,  9, 10, 11])

现在 'a' 变成带有选定元素的一维数组
此属性在赋值中非常有用:

a[b] = 0
a

array([[0, 1, 2, 3],
       [4, 0, 0, 0],
       [0, 0, 0, 0]])

'a' 中大于 4 的所有元素都变为 0
正如整数索引中所做的那样,我们可以通过布尔值进行索引:
设 x 为原始矩阵,'y' 和 'z' 为布尔值数组以选择行和列。

x = np.arange(15).reshape(3,5)
y = np.array([True,True,False]) # 第一个暗淡选择
z = np.array([True,True,False,True,False] ) # 第二个暗淡选择

我们编写 x[y,:] ,它将仅选择 y 为 True 的行。

x[y,:] # 选择行
x[y] # 相同的事情

写入 x[:,z] 将仅选择 z 为 True 的那些列。

x[:,z] # 选择列

x[y,:]                                   # selecting rows
Output: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

x[y]                                     # same thing
Output: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

x[:,z]                                   # selecting columns
Output: 
array([[ 0,  1,  3],
       [ 5,  6,  8],
       [10, 11, 13]])

Pandas DataFrame 的统计数据

让我们创建虚拟数据框进行说明:

np.random.seed(234)
mydata = pd.DataFrame({"x1" : np.random.randint(low=1, high=100, size=10),
                     "x2"  : range(10)
                     })

1.计算数据框每列的平均值

np.mean(mydata)

2.计算数据框每列的中位数

np.中位数(mydata,轴=0)

axis = 0表示将在每列上运行中值函数。axis = 1 表示要在每一行上运行的函数。

堆叠各种数组
让我们考虑 2 个数组 A 和 B:

A = np.array([[10,20,30],[40,50,60]])
B = np.array([[100,200,300],[400,500,600]])

为了垂直连接它们,我们使用np.vstack( )。

np.vstack((A,B)) #垂直堆叠

array([[ 10,  20,  30],
       [ 40,  50,  60],
       [100, 200, 300],
       [400, 500, 600]])

为了水平连接它们,我们使用 np.hstack( )。

np.hstack((A,B)) #水平堆叠

array([[ 10,  20,  30, 100, 200, 300],
       [ 40,  50,  60, 400, 500, 600]])

newaxis 有助于将一维行向量转换为一维列向量。

from numpy import newaxis
a = np.array([4.,1.])
b = np.array([2.,8.])
a[:,newaxis]

array([[ 4.],
       [ 1.]])

#函数np.column_stack( ) 将一维数组作为列堆叠到二维数组中。它仅相当于一维数组的 hstack:

np.column_stack((a[:,newaxis],b[:,newaxis]))
np.hstack((a[:,newaxis],b[:,newaxis])) # 与column_stack相同

np.column_stack((a[:,newaxis],b[:,newaxis]))
Output: 
array([[ 4.,  2.],
       [ 1.,  8.]])

np.hstack((a[:,newaxis],b[:,newaxis]))
Output: 
array([[ 4.,  2.],
       [ 1.,  8.]])

拆分数组
考虑一个包含 15 个元素的数组“z”:

z = np.arange(1,16)

使用np.hsplit( ) 可以分割数组

np.hsplit(z,5) # 将a分割成5个数组

[array([1, 2, 3]),
 array([4, 5, 6]),
 array([7, 8, 9]),
 array([10, 11, 12]),
 array([13, 14, 15])]

它将“z”分成 5 个等长的数组。
传递 2 个元素后,我们得到:

例如hsplit(z,(3,5))

[array([1, 2, 3]),
 array([4, 5]),
 array([ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15])]

它在第三个和第五个元素之后分割“z”。
对于 2D 数组,np.hsplit() 的工作原理如下:

A = np.arange(1,31).reshape(3,10)
A
np.hsplit(A,5) # 将a拆分为5个数组

[array([[ 1,  2],
        [11, 12],
        [21, 22]]), array([[ 3,  4],
        [13, 14],
        [23, 24]]), array([[ 5,  6],
        [15, 16],
        [25, 26]]), array([[ 7,  8],
        [17, 18],
        [27, 28]]), array([[ 9, 10],
        [19, 20],
        [29, 30]])]

在上面的命令中,A 被分成 5 个形状相同的数组。
要在第三列和第五列之后进行拆分,我们编写:

np.hsplit(A,(3,5))

[array([[ 1,  2,  3],
        [11, 12, 13],
        [21, 22, 23]]), array([[ 4,  5],
        [14, 15],
        [24, 25]]), array([[ 6,  7,  8,  9, 10],
        [16, 17, 18, 19, 20],
        [26, 27, 28, 29, 30]])]

复制
考虑一个数组 x

x = np.arange(1,16)

我们将 y 指定为 x,然后说“y 是 x”

y = x
y 是 x

让我们改变 y 的形状

y.形状 = 3,5

请注意,它改变了 x 的形状

x.形状

(3, 5)

创建数据视图
让我们将 z 存储为x 的视图

z = x.view()
z 是 x

False

因此 z 不是 x。
改变 z 的形状

z.形状 = 5,3

创建视图不会改变 x 的形状

x.形状

(3, 5)

更改 z 中的元素

z[0.0] = 1234

请注意,x 中的值也会发生变化:

X

array([[1234,    2,    3,    4,    5],
       [   6,    7,    8,    9,   10],
       [  11,   12,   13,   14,   15]])

因此,显示的变化不会妨碍原始数据,但视图值的变化会影响原始数据。

创建数据的副本:
现在让我们创建 z 作为 x 的副本:

z = x.copy()

注意 z 不是 x

z 是 x

更改 z 中的值

z[0,0] = 9999

x 中没有进行任何更改。

X

array([[1234,    2,    3,    4,    5],
       [   6,    7,    8,    9,   10],
       [  11,   12,   13,   14,   15]])

Python 有时可能会给出“设置复制”警告,因为它无法识别新的数据帧或数组(作为另一个数据帧或数组的子集创建)是视图还是副本。因此,在这种情况下,用户需要指定它是副本还是视图,否则 Python 可能会妨碍结果。

练习:Numpy

 

1. 如何从数组中提取偶数?

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

所需输出: 数组([0,2,4,6,8])

 

显示解决方案

arr[arr % 2 == 0]

 

2. 如何找出x和y元素相同的位置

x = np.array([5,6,7,8,3,4])
y = np.array([5,3,4,5,2,4])

所需输出: 数组([0, 5]

 

显示解决方案

np.where(x == y)

 

3. 如何标准化值,使其介于 0 和 1 之间

k = np.array([5,3,4,5,2,4])

提示: k-min(k)/(max(k)-min(k))

 

显示解决方案

kmax, kmin = k.max(), k.min()
k_new = (k - kmin)/(kmax - kmin)

 

4. 如何计算数组的百分位数

p = np.array([15,10, 3,2,5,6,4])

 

显示解决方案

np.percentile(p, q=[5, 95])

 

5. 打印数组中缺失值的数量

p = np.array([5,10, np.in, 3, 2, 5, 6, np.in])

 

显示解决方案

print("缺失值的个数=", np.isnan(p).sum())