科学计算NumPy之Ndarray数组对象的创建、切片、索引、修改等操作汇总

news2024/10/6 18:33:59

NumPy的操作汇总

  • NumPy概述
  • Ndarray对象
    • 基本使用
    • Ndarray的属性
    • Ndarray的类型
    • Ndarray的形状
  • 创建数组
    • 创建数组
    • 创建全1数组
    • 创建全1数组
    • 从已有数组创建新数组
    • 从现有数组生成
    • 创建等差数列数组
    • 创建等比数列数组
    • 创建等间隔数列数组
    • 创建随机数数组
    • 创建正态分布创建
    • 创建均匀分布
  • 数组切片和索引
    • 切片
    • 索引
    • 高级索引
  • 数组形状的修改
    • reshape函数
    • resize函数
    • T属性
    • flat属性
    • flatten函数
    • ravel函数
  • 数据类型的修改
    • astype()
    • tobytes()
  • 数组的其他操作
    • 数组运算
    • 数组去重
    • 翻转数组

NumPy概述

NumPy是Python中的一个常用开源数学计算扩展库,是Numerical Python的缩写。支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。这使得NumPy在科学计算、统计分析、数据挖掘、机器学习等领域中广泛使用。

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

总之,NumPy是Python中重要的扩展库之一,它对于支持高效的计算和数据分析非常有用。

NumPy官网:https://numpy.org/

NumPy源代码:https://github.com/numpy/numpy

Ndarray对象

Ndarray对象用于存储同一数据类型的多维数组。Ndarray可以支持基于数组的计算以及矢量化操作。

基本使用

# 导入NumPy模块并创建ndarray
import numpy as np
a = np.array([1,2,3,4,5])
print(a) # [1 2 3 4 5]

# 创建二维数组
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(b)
#[[1 2 3]
# [4 5 6]
# [7 8 9]]

# 调整数组的形状
c = np.array([1,2,3,4,5,6,7,8])
print(c.reshape(2,4))
#[[1 2 3 4]
# [5 6 7 8]]

# 访问数组元素
print(b[2,1]) # 8


# 数组的基本运算
# 加法
print(a + a) # [ 2  4  6  8 10]

# 减法
print(a - a) # [0 0 0 0 0]

# 乘法
print(a * a) # [ 1  4  9 16 25]

# 除法
print(a / a) # [1. 1. 1. 1. 1.]

# 类型
type(a) # numpy.ndarray

Ndarray的属性

在NumPy中,ndarray是多维数组对象。 ndarray类具有各种属性。数组属性反映了数组本身固有的信息。

属性名字属性解释
ndarray.shape返回一个元组,其中包含ndarray对象的每个维度的大小
ndarray.ndim返回数组的维数
ndarray.dtype返回数组元素的数据类型
ndarray.size返回数组中的总元素数
ndarray.itemsize返回数组中每个元素的字节数
nbytes返回数组中所有元素所占用的字节数
ndarray.T返回数组的转置视图
ndarray.real返回数组实部的视图
ndarray.imag返回数组虚部的视图
ndarray.flat返回一个数组元素迭代器
ndarray.flags返回一个描述数组内存块信息的对象,例如是否为C或Fortran连续等
ndarray.strides返回每个维度中相邻元素的字节数组成的元组,也可以用于判断数组是否是连续的
ndarray.base如果数组是视图,则返回其基础数组,否则返回None
ndarray.data返回指向数组内存块的Python缓冲区对象
ndarray.ctypes返回表示数组内存块的ctypes对象

Ndarray的类型

查看Ndarray的类型

a = np.array([[1,2,3],[4,5,6]])

type(a.dtype)

在这里插入图片描述
创建数组的时候指定类型

a = np.array([[1,2,3],[4,5,6]], dtype=np.int8)

type(a.dtype)

在这里插入图片描述

名称描述简写
np.bool用一个字节存储的布尔类型(True或False)‘b’
np.int_默认整数类型(通常为int32或int64)‘i’
np.intc等同于C语言中的int类型‘i’
np.intp用于表示索引的整数类型(通常为int32或int64)‘i’
np.int8一个字节大小,-128 至 127‘i1’
np.int16短整数,-32768 至 32767‘i2’
np.int32标准整数,-2^31​ 至 2^32 -1‘i4’
np.int64长整数,-2^63 至 2^63 - 1‘i8’
np.uint8无符号整数,0 至 255‘u’
np.uint16无符号短整数,0 至 65535‘u2’
np.uint32无符号标准整数,0 至 2^32 - 1‘u4’
np.uint64无符号长整数,0 至 2^64 - 1‘u8’
np.float_默认浮点数类型(通常为float64)‘f’
np.float16半精度浮点数:16位,正负号1位,指数5位,精度10位‘f2’
np.float32单精度浮点数:32位,正负号1位,指数8位,精度23位‘f4’
np.float64双精度浮点数:64位,正负号1位,指数11位,精度52位‘f8’
np.complex_默认复数类型,由两个32位浮点数组成,一个表示实部,一个表示虚部‘c’
np.complex64由两个32位浮点数组成的复数类型,一个表示实部,一个表示虚部‘c8’
np.complex128由两个64位浮点数组成的复数类型,一个表示实部,一个表示虚部‘c16’
np.object_python对象‘O’
np.string_字符串‘S’
np.unicode_unicode类型‘U’

Ndarray的形状

在Python的NumPy库中,ndarray的形状是指数组的维度和大小。可以使用ndarray.shape属性来获取数组的形状。它返回一个元组,其中包含每个维度的大小。

# 导入NumPy模块并创建ndarray
import numpy as np

# 一维数组
a = np.array([1,2,3,4])
# 形状 (4,):(元素个数)
print(a.shape)
# 二维数组
b = np.array([[1,2,3],[4,5,6]])
# 形状 (2, 3):(行数,列数)
print(b.shape)
# 三维数组
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
# 形状 (2, 2, 3):(层数,行数,列数)
print(c.shape)

形状

(4,)
(2, 3)
(2, 2, 3)

创建数组

NumPy是Python中用于科学计算的核心库之一,创建数组是NumPy最基本和常用的操作之一。

创建数组

import numpy as np 

arr1 = np.array([1, 2, 3]) # 一维数组
print(arr1)
print()

arr2 = np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组
print(arr2)
[1 2 3]

[[1 2 3]
 [4 5 6]]

创建全1数组

使用numpy.zeros()函数创建全1数组

arr3 = np.zeros((3, 4)) # 创建一个3行4列的全零数组
print(arr3)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

np.zeros(shape, dtype)

import numpy as np

# np.zeros((3, 2, 4), dtype=np.int8)
np.zeros((3, 2, 4))

在这里插入图片描述

创建全1数组

使用numpy.ones()函数创建全1数组

arr4 = np.ones((2, 3, 4)) # 创建一个2行3列4深度的全1数组
print(arr4)
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]

np.ones(shape, dtype)

import numpy as np

# np.ones((3, 2, 4), dtype=np.int8)
np.ones((3, 2, 4))

在这里插入图片描述

从已有数组创建新数组

np.zeros_like(a, dtype):创建一个与给定数组a相同形状的全0数组。

a: 输入的数组

dtype: 输出数组的数据类型,可选参数,默认为None,表示输出数组的数据类型与输入数组的数据类型相同。
import numpy as np

a = np.array([[1,2,3],[4,5,6]])

np.zeros_like(a)

在这里插入图片描述
np.ones_like(a, dtype):创建一个与给定数组a相同形状的全1数组。

import numpy as np

a = np.array([[1,2,3],[4,5,6]])

np.ones_like(a)

np.full_like(a, number):创建一个与给定数组a相同形状,且全是number相同值的数组。

import numpy as np

a = np.array([[1,2,3],[4,5,6]])

np.full_like(a, 3)

在这里插入图片描述

从现有数组生成

np.array(object, dtype) : 复杂形式生成新数组

np.asarray(a, dtype) :引用形式生成新数组
import numpy as np

a = np.array([[1,2,3],[4,5,6]])
b = np.array(a)
print(b)
print()

c = np.asarray(a)
print(c)
print()

# 复杂与引用
a[0,0]=8
print(b)
print()

print(c)

在这里插入图片描述

创建等差数列数组

使用numpy.arange()函数创建等差数列数组

arange函数: 用于创建一维等差数列

numpy.arange(start, stop, step, dtype=None)

参数:

start表示数列的起始值
stop表示数列的结束值(不包括在数列内)
step表示数列的公差,默认值为1
dtype表示输出数组的数据类型,可选参数,默认为None
[0 2 4 6 8]
arr5 = np.arange(10) # 创建0~9的一维数组
print(arr5)
print()

arr6 = np.arange(10, 20, 2) # 创建10~19,步长为2的一维数组
print(arr6)
[0 1 2 3 4 5 6 7 8 9]

[10 12 14 16 18]

创建等比数列数组

logspace函数:它是NumPy中用于创建等比数列的函数

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

参数:

start表示数列起始值的对数
stop表示数列结束值的对数
num表示数列的元素个数,默认为50
endpoint表示数列是否包含stop,可选参数,默认为True,表示包含
base表示对数的底数,可选参数,默认为10.0
dtype表示输出数组的数据类型,可选参数,默认为None

start为0,stop为2,num为3,因此生成的数组包括10的0次方、10的1次方、10的2次方、这3个元素

import numpy as np

a = np.logspace(0, 2, 3)
print(a)
[  1.  10. 100.]

创建等间隔数列数组

使用numpy.linspace()函数创建等间隔数列数组

linspace函数: 用于创建一维等间隔数列

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

参数:

start表示数列的起始值
stop表示数列的结束值
num表示数列的元素个数,默认为50
endpoint表示数列是否包含stop,可选参数,默认为True,表示包含
retstep表示是否返回数列的公差,可选参数,默认为False
dtype表示输出数组的数据类型,可选参数,默认为None
[ 0.   2.5  5.   7.5 10. ]
```python
arr7 = np.linspace(0, 10, num=5) # 创建0~10,共5个元素的一维数组
print(arr7)
[ 0.   2.5  5.   7.5 10. ]

创建随机数数组

在NumPy中,可以使用random模块生成随机数组,它提供了许多生成随机数的函数

1.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数数组,形状为(d0, d1, …, dn)

import numpy as np

# 生成一个形状为(3,4)的二维随机浮点数数组
arr = np.random.rand(3,4)
print(arr)
[[0.26432437 0.77952426 0.48623514 0.30298591]
 [0.09537777 0.78211903 0.03010303 0.65959564]
 [0.59885643 0.45849452 0.62176301 0.98593692]]

2.randint(low, high=None, size=None, dtype='l'):生成一个指定范围内的随机整数数组,范围为[low, high),形状为size

import numpy as np

# 生成一个形状为(3,4)的二维随机整数数组,范围在0~9之间
arr = np.random.randint(0, 10, size=(3,4))
print(arr)
[[2 3 6 5]
 [7 7 6 3]
 [1 9 8 7]]

3.randn(d0, d1, ..., dn):生成一个符合标准正态分布的随机浮点数数组,形状为(d0, d1, …, dn)。

import numpy as np

# 生成一个形状为(3,4)的二维随机正态分布浮点数数组
arr = np.random.randn(3,4)
print(arr)
[[ 0.29336025 -0.25675439 -0.50450466 -0.4746103 ]
 [ 0.03172494  2.1259797  -0.74760344  0.3182968 ]
 [ 1.17818071 -0.04738495  0.96936186 -0.59401059]]

4.choice(a, size=None, replace=True, p=None):从序列a中随机选择元素,形状为size。

import numpy as np

# 从序列[1,2,3,4,5]中随机选择3个元素,可以重复选择
arr = np.random.choice([1,2,3,4,5], size=3, replace=True)
print(arr)
[3 5 4]

5.shuffle(x):将数组x中的元素随机打乱。

import numpy as np

# 将数组[1,2,3,4,5]的元素随机打乱
arr = np.array([1,2,3,4,5])
np.random.shuffle(arr)
print(arr)
[1 4 3 2 5]

6.permutation(x):生成一个长度为x的随机排列。

import numpy as np

# 生成[1,2,3,4,5]的一个随机排列
arr = np.random.permutation([1,2,3,4,5])
print(arr)
[1 2 5 4 3]

7.uniform(low=0.0, high=1.0, size=None):生成一个指定范围内的随机浮点数数组,范围为[low, high),形状为size。

import numpy as np

# 生成范围在0~1之间,形状为(3,4)的随机浮点数数组
arr = np.random.uniform(0, 1, size=(3,4))
print(arr)
[[0.61168926 0.22624021 0.47425274 0.23939561]
 [0.46624301 0.47819303 0.94655511 0.54215361]
 [0.41453386 0.00867036 0.944361   0.21546454]]

8.normal(loc=0.0, scale=1.0, size=None):生成一个符合正态分布的随机浮点数数组,均值为loc,标准差为scale,形状为size。

import numpy as np

# 生成符合正态分布,均值为2,标准差为0.5,形状为(3,4)的随机浮点数数组
arr = np.random.normal(2, 0.5, size=(3,4))
print(arr)
[[1.17987997 2.56549112 2.44398794 1.87356755]
 [2.32802641 1.48166655 1.83425736 2.19375628]
 [1.95532272 2.37164462 1.1235498  3.20875395]]

创建正态分布创建

在NumPy中,可以使用random模块生成符合正态分布的随机数组,也可以使用numpy.random.normal函数生成符合正态分布的随机数组。

1.使用numpy.random.randn函数生成符合标准正态分布的随机数组。该函数生成的随机数组的均值为0,标准差为1

randn(d0, d1, ..., dn):生成一个符合标准正态分布的随机浮点数数组,形状为(d0, d1, …, dn)。

import numpy as np

# 生成一个形状为(3,4)的二维随机正态分布浮点数数组
arr = np.random.randn(3,4)
print(arr)
[[ 0.29336025 -0.25675439 -0.50450466 -0.4746103 ]
 [ 0.03172494  2.1259797  -0.74760344  0.3182968 ]
 [ 1.17818071 -0.04738495  0.96936186 -0.59401059]]

2.使用numpy.random.normal函数生成符合正态分布的随机数组

loc表示均值(对应着整个分布的中心centre)

scale表示标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

size表示生成随机数组的形状,可以是一个整数,也可以是一个元组
import numpy as np

# 生成符合正态分布,均值为2,标准差为0.5,形状为(3,4)的随机浮点数数组
arr = np.random.normal(loc=2, scale=0.5, size=(3,4))
print(arr)
[[2.89275846 1.15803228 1.34008352 1.88054608]
 [1.66740778 1.63232764 2.94805734 1.98300664]
 [2.13753558 2.23281831 2.29074783 2.65143685]]
import numpy as np
# 生成符合正态分布,均值为2,标准差为0.5,形状为(10)的随机浮点数数组
arr = np.random.normal(loc=2, scale=0.5, size=10)
print(arr)
[2.01552148 1.8041927  1.88017211 2.25788431 1.89537179 1.42416331
 1.8956769  1.83538611 2.21150618 1.70890545]

查看分布状况

import numpy as np
# 导入matplotlib
import matplotlib.pyplot as plt

# 生成符合正态分布,均值为2,标准差为0.5,形状为(10)的随机浮点数数组
arr = np.random.normal(loc=2, scale=0.5, size=100)

# 创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 绘制直方图
plt.hist(arr, 100)

# 显示图像
plt.show()

在这里插入图片描述

3.使用standard_normal生成符合标准正态分布的随机数组。所谓标准正态分布,是指均值为0,标准差为1的正态分布。

import numpy as np

# 生成符合标准正态分布,形状为(3,4)的随机浮点数数组
arr = np.random.standard_normal(size=(3,4))
print(arr)
[[ 1.12968206 -1.2614278  -0.62009164  0.70146956]
 [-0.10669066 -1.17190998 -0.41877638 -0.7174823 ]
 [ 0.63915822 -0.3381549  -1.89787523 -0.14796177]]

创建均匀分布

1.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数数组,形状为(d0, d1, …, dn)。

import numpy as np

# 生成形状为(3,4)的均匀分布随机浮点数数组
arr = np.random.rand(3,4)
print(arr)

2.randint(low, high=None, size=None, dtype='l'):生成一个指定范围内的随机整数数组,范围为[low, high),形状为size。

# 生成范围在0~9之间,形状为(3,4)的均匀分布随机整数数组
arr = np.random.randint(0, 10, size=(3,4))
print(arr)

3.uniform(low=0.0, high=1.0, size=None):生成一个指定范围内的随机浮点数数组,范围为[low, high),形状为size。

import numpy as np

# 生成范围在0~1之间,形状为(3,4)的均匀分布随机浮点数数组
arr = np.random.uniform(0, 1, size=(3,4))
print(arr)
import numpy as np

# 生成范围在0~9之间,形状为(3,4)的均匀分布随机整数数组
arr = np.random.uniform(1, 2, size=(100000))

# 导入matplotlib
import matplotlib.pyplot as plt
# 创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 绘制直方图
plt.hist(arr, 100)

# 显示图像
plt.show()

在这里插入图片描述

数组切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作。

切片和索引示例:

a = np.array([1, 2, 3, 4, 5])
print(a[0])     # 输出1
print(a[1:3])   # 输出[2, 3]

b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(b[0, 1])   # 输出2
print(b[1:, :2]) # 输出[[4, 5], [7, 8]]

切片

NumPy数组切片是指从NumPy数组中选择一个子集的操作。

过冒号分隔切片,使用冒号 “:” 分隔起始和结束索引,还可以指定步长。

一维数组:例如 a[1:4] 表示获取数组 a 中从第二个元素到第四个元素的子数组

多维数组:例如 b[1:, :2] 表示获取二维数组 b 中从第二行到最后一行,第一列到第二列的子数组

1.简单数组通过内置的slice函数切片

import numpy as np
 
# 通过 arange() 函数创建 ndarray 对象
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]

# 从索引 2 开始到索引 7 停止,间隔为2

s = slice(2,7,2)
print (a[s]) # [2 4 6]

2.基本切片

基本切片使用冒号(:)分隔[start:stop:step],其中start表示起始位置,stop表示终止位置(不包括该位置),step表示步长。如果没有给定start和step,则默认为0和1。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
print(arr[1:5])  # [1 2 3 4]

arr = np.array([0, 1, 2, 3, 4, 5, 6])
# 设置起始,终止和步长的参数
print(arr[:6:2])  # [0 2 4]

3.多维切片

可以使用逗号分隔多个索引值,以访问多维数组中的特定元素。

import numpy as np

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

# b[1:, :2]:表示获取第二行到最后一行,第一列到第二列的子数组
print(b[1:, :2])  #  [[4 5] [7 8]]
# b[:2, ::-1]:表示获取第一行到第二行,倒序获取每一列的子数组
print(b[:2, ::-1])  #  [[3 2 1] [6 5 4]]

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

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

4.切片赋值

可以使用切片运算符来改变数组的部分内容。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
arr[3:5] = 10
print(arr)  # [ 0  1  2 10 10  5  6]

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr[:2, 1:] = 10
print(arr)  # [[ 0 10 10] [ 3 10 10] [ 6  7  8]]

索引

NumPy数组索引是指用于选择特定元素或子集的方法。

可以使用整数或布尔数组来索引 NumPy 数组。对于一维数组,可以使用一个整数作为索引,对于多维数组,需要使用一个元组来指定每个维度的索引。

一维数组:使用一个整数作为索引,例如 a[0] 表示获取数组 a 的第一个元素

多维数组:需要使用一个元组来指定每个维度的索引,例如 b[0, 1] 表示获取二维数组 b 的第一行的第一列元素

NumPy数组索引的汇总:

1.基本索引

基本索引使用整数索引值访问NumPy数组中的特定元素。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
print(arr[2])  # 2

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

2.多维索引

可以使用逗号分隔多个索引值,以访问多维数组中的特定元素。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
print(arr[[1, 3, 5]])  # [1 3 5]

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

3.花式索引

花式索引是一种使用整数数组进行数组索引的方法,它允许同时获取数组的任意子集,可以是不连续的。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
indices = [1, 3, 5]
print(arr[indices])  # [1 3 5]

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
row_indices = [0, 1]
col_indices = [1, 2]
print(arr[row_indices, col_indices])  # [1 5]

4.布尔索引

布尔索引使用布尔值(True或False)来指示数组中的每个元素是否应该被选择。这种索引通常用于根据特定条件选择数组的子集。布尔数组的长度必须与被索引的轴的长度相同。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
bool_arr = arr > 3
print(arr[bool_arr])  # [4 5 6]

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
bool_arr = np.array([[False, True, False], [True, False, True], [False, True, False]])
print(arr[bool_arr])  # [1 3 5 7]

a = np.array([1, 2, 3, 4, 5])
mask = np.array([True, False, True, False, True])
print(a[mask])  # 输出 [1 3 5]

b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mask = np.array([True, False, True])
print(b[mask, :])  # 输出 [[1 2 3] [7 8 9]]

5.索引赋值

NumPy 数组的切片是原始数组的视图,即它们与原始数组共享数据。这意味着,在切片中的任何更改都会反映在原始数组中。

import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = a[1:4]
b[1] = 0
print(a)  # 输出 [1 2 0 4 5]

综合应用示例:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(a[0])  # 1
print(a[1])  # 2
print(a[2:])  # [3 4 5]

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

# b[0, 0] 表示获取第一行第一列的元素,即数组的第一个元素,结果为 1
print(b[0, 0])  # 1
print(b[0, 1])  # 2
print(b[0, 2])  # 3
print(b[1, 0])  # 4
print(b[1, 1])  # 5

# 表示获取第一行到最后一行,第二列的子数组
print(b[:, 1])  # [2 5 8]

import numpy as np
 
# 三维
a = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
print(a)
# a[0, 0, 1] 表示获取第一维的第一个元素,第二维的第一个元素,第三维的第二个元素,即获取第一个二维数组中的第二个元素,结果为 2
# 获取第一维的第一个元素,即 a[0],得到的是数组 [[1, 2, 3], [4, 5, 6]]。这个数组是原始三维数组 a 的第一个二维数组
# 获取第二维的第二个元素,即 a[0, 1],得到的是数组 [4, 5, 6]。这个数组是原始三维数组 a 的第一个二维数组中的第二个一维数组。
# 获取第三维的第三个元素,即 a[0, 1, 2],得到的是整数 6。这个整数是原始三维数组 a 的第一个二维数组中的第二个一维数组的第三个元
print(a[0, 0, 1])   #  2
print(a[0, 1, 2])   #  6
print(a[1, 1, 0])   #  5

高级索引

在索引和切片操作中,可以使用一些参数来指定更复杂的操作

1.整数数组索引

整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。

import numpy as np

a = np.array([1, 2, 3, 4, 5])
indices = np.array([0, 2, 4])
print(a[indices])  # 输出 [1 3 5]

b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# row_indices和col_indices分别为长度为2的一维数组,分别表示需要获取的行索引和列索引。
row_indices = np.array([0, 2])
col_indices = np.array([1, 2])
# b[row_indices, col_indices] 表示获取对应行列索引位置的元素,即获取 (0, 1) 和 (2, 2) 位置的元素,
print(b[row_indices, col_indices])  # 输出 [2 9]

2....:用于指定省略号表示在多维数组中使用完整切片

import numpy as np

b = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
#[[[1 2]
#  [3 4]]

# [[5 6]
#  [7 8]]]
# b[..., 0] 表示获取第三维的第一个元素,即获取每个二维数组中的第一列元素
print(b[..., 0])  # 输出 [[1 3] [5 7]]

3.布尔数组索引:使用布尔数组来获取满足条件的元素

import numpy as np

a = np.array([1, 2, 3, 4, 5])
mask = a > 2
print(a[mask])  # 输出 [3 4 5]

b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mask = b > 5
print(b[mask])  # 输出 [6 7 8 9]

4.np.newaxis:用于增加数组的维度。

import numpy as np

a = np.array([1, 2, 3])
# [1 2 3]
# a[:, np.newaxis] 表示在行方向上增加一个维度,即将一维数组转换为二维数组
b = a[:, np.newaxis]
#[[1]
# [2]
# [3]]
print(b.shape)  # 输出 (3, 1)

5.where()函数

where()函数是一种将条件作为输入并返回满足条件的元素的索引的方法。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
indices = np.where(arr > 3)
print(indices)  # (array([4, 5, 6]),)

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
indices = np.where(arr % 2 == 0)
print(indices)  # (array([0, 0, 1, 2]), array([0, 2, 1, 0]))

6.take()函数

take()函数是一种从数组中提取元素的方法,它使用整数索引值作为输入,并返回对应的元素值。

import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5, 6])
indices = [1, 3, 5]
print(np.take(arr, indices))  # [1 3 5]

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
indices = [1, 2]
print(np.take(arr, indices, axis=1))  # [[1 2] [4 5] [7 8]]

数组形状的修改

reshape函数

numpy.reshape(a, newshape, order='C')

用于改变数组的形状,即改变数组的维度大小。它返回一个新的数组,而不改变原始数组。

参数:

a:要改变形状的数组

newshape:新的形状,可以是一个整数、元组或列表。如果为元组或列表,则表示每个维度的大小

order:可选参数,表示返回数组的元素在内存中的存储顺序。
       默认为 'C' 表示按行存储,'F' 表示按列存储,'A' 表示原顺序,'k' 表示元素在内存中的出现顺序。
a = np.array([[1, 2], [3, 4], [5, 6]])
print(a.shape)        # 输出(3, 2)
print(a.reshape(2, 3)) # 输出[[1, 2, 3], [4, 5, 6]]

b = np.array([1, 2, 3, 4, 5, 6])
print(b.reshape(2, -1))  # 输出[[1, 2, 3], [4, 5, 6]]
import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.reshape(a, (2, 3))  # 将 a 改为 2 行 3 列的数组
print(b)

a是一个 3 行 2 列的数组,使用 reshape() 函数将其改为 2 行 3 列的数组。注意,新的数组的元素顺序是按行存储的

[[1 2 3]
 [4 5 6]]

resize函数

ndarray.resize(new_shape)

用于修改数组的形状和大小,与 reshape() 不同,它会改变原始数组。如果新的大小比原始大小大,则新的数组将填充额外的空间,如果新的大小比原始大小小,则原始数组的一部分元素将被删除。

new_shape:新的形状,可以是一个整数、元组或列表。如果为元组或列表,则表示每个维度的大小。
import numpy as np
# a 是一个 3 行 2 列的数组,使用 resize() 函数将其改为 2 行 3 列的数组。注意,原始数组被修改了,而不是返回一个新的数组
a = np.array([[1, 2], [3, 4], [5, 6]])
a.resize((2, 3))  # 将 a 的大小改为 2 行 3 列
print(a)
[[1 2 3]
 [4 5 6]]

T属性

ndarray.T

用于返回数组的转置,即将数组的行和列交换。它不会修改原始数组,而是返回一个新的数组。

import numpy as np
# a是一个 3 行 2 列的数组,使用 T 属性返回其转置,即 2 行 3 列的数组。注意,原始数组 a 并没有被修改,而是返回了一个新的数组
a = np.array([[1, 2], [3, 4], [5, 6]])
b = a.T  # 返回 a 的转置
print(b)
[[1, 2]
 [3, 4]   
 [5, 6]]
  
[[1 3 5]
 [2 4 6]]

flat属性

numpy.ndarray.flat

用于返回一个数组的一维迭代器,即将数组展开成一个一维数组。它可以用于遍历数组中的每一个元素。

import numpy as np
# a 是一个 3 行 2 列的数组,使用 flat 属性返回一个一维迭代器,然后使用 for 循环遍历数组中的每一个元素
a = np.array([[1, 2], [3, 4], [5, 6]])
for x in a.flat:
    print(x)
1
2
3
4
5
6

flatten函数

ndarray.flatten(order='C')

用于将一个多维数组展开成一个一维数组。它返回一个新的数组,而不改变原始数组。

import numpy as np
# 使用 flatten() 函数将其展开成一个一维数组。注意,原始数组 a 并没有被修改,而是返回了一个新的数组。
a = np.array([[1, 2], [3, 4], [5, 6]])
b = a.flatten()  # 将 a 展开成一个一维数组
print(b) # [1 2 3 4 5 6]

ravel函数

numpy.ravel(a, order='C')

用于将一个多维数组展开成一个一维数组。它与 flatten() 函数类似,但是有一些不同之处。ravel() 函数返回的是原始数组的一个视图,而不是新的数组,如果修改返回的数组,原始数组也会发生改变。

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.ravel(a)  # 将 a 展开成一个一维数组
print(b) [1 2 3 4 5 6]

数据类型的修改

astype()

ndarray.astype() :用于将数组的数据类型转换为指定的数据类型。它返回一个新的数组,而不改变原始数组。

type:要转换成的数据类型,可以是 Python 的数据类型,也可以是 Numpy 的数据类型。

import numpy as np

a = np.array([1, 2, 3])
b = a.astype(float)  # 将 a 转换成浮点数类型
print(b) # [1. 2. 3.]

tobytes()

ndarray.tostring(order='C')
ndarray.tobytes(order='C')

ndarray.tostring() 和 ndarray.tobytes() 函数都用于将数组转换成字符串。它们的作用是相同的,两个函数的参数也相同。tostring()在新版中已弃用。

import numpy as np

a = np.array([1, 2, 3], dtype=np.int32)
b = a.tostring() 
c = a.tobytes()
# 返回的字符串是一个字节串(bytes),每个元素占用 4 个字节
print(b) # b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
print(c) # b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'

数组的其他操作

数组运算

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)   # 输出[5, 7, 9]
print(a * b)   # 输出[4, 10, 18]

c = np.array([[1, 2], [3, 4]])
d = np.array([[5, 6], [7, 8]])
print(np.dot(c, d))   # 输出[[19, 22], [43, 50]]

数组去重

1.unique()

np.unique() 函数用于去除数组中的重复元素,并返回一个有序的数组。它可以用于对数组进行去重操作。

np.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)

参数:

ar:要去重的数组
return_index:可选参数,表示是否返回新数组元素在旧数组中的位置
return_inverse:可选参数,表示是否返回旧数组中元素在新数组中的位置
return_counts:可选参数,表示是否返回每个元素在数组中出现的次数
axis:可选参数,表示沿着哪个轴进行去重操作
import numpy as np
# a 是一个包含重复元素的数组,使用 np.unique() 函数将其去重,并返回一个有序的数组。注意,返回的数组是一个新的数组,原始数组 a 并没有被修改
a = np.array([1, 2, 3, 2, 1, 4, 5, 4])
b = np.unique(a)  # 返回去重后的有序数组
print(b) # [1 2 3 4 5]

2.set()

set() 函数可以将一个数组转换成一个集合,由于集合中不能包含重复元素,因此可以用它来进行数组去重操作。但是,使用 set() 函数会改变数组中元素的顺序。

a = [1, 2, 3, 2, 1, 4, 5, 4]
b = list(set(a))  # 使用 set() 函数进行数组去重
print(b) # [1, 2, 3, 4, 5]

翻转数组

要翻转一个NumPy数组,可以使用numpy.flip()函数。该函数接受一个数组和一个或多个轴参数,并返回按指定轴翻转后的数组。

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原始数组:")
print(arr)

# 沿着第一个轴翻转数组(行)
arr_flipped = np.flip(arr, axis=0)
print("沿着第一个轴翻转后的数组:")
print(arr_flipped)

# 沿着第二个轴翻转数组(列)
arr_flipped = np.flip(arr, axis=1)
print("沿着第二个轴翻转后的数组:")
print(arr_flipped)

原始数组:
[[1 2 3]
 [4 5 6]]
沿着第一个轴翻转后的数组:
[[4 5 6]
 [1 2 3]]
沿着第二个轴翻转后的数组:
[[3 2 1]
 [6 5 4]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/461490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC高并发编程】—— 再见JUC

一、读写锁 读写锁概述 1️⃣ 什么是读写锁? 读写锁是一种多线程同步机制,用于在多线程环境中保护共享资源的访问 与互斥锁不同的是,读写锁允许多个线程同时读取共享资源,但在有线程请求写操作时,必须将其他读写锁…

windows10 ubuntu子系统安装perf工具

文章目录 1,ubuntu子系统中perf工具安装不了1.1,查看perf版本如下所示1.2,网上找不到对应的版本的内核源码,下载别的版本后,编译各种报错 2,百度查到说是WSL1不支持perf2.1,查看WSL版本 2.2&…

MySQ基础知识整合

目录 模糊查询 排序 单行函数 多行函数 分组函数 having 单表查询执行顺序总结 distinct 连接查询 子查询 union limit DQL语句执行顺序 DDL语句 日期化 date和date_format区别 update table 的快速创建以及删除(及回滚) 约束 事务 …

HTTP基础知识汇总

伴随着云原生(Cloud Native)的兴起,面向服务架构(Service-Oriented Architecture,SOA)、微服务(Microservice)、容器(Container)等相关概念与技术正在逐渐影响CAx(CAD/CAE/CAM)软件的架构设计与开发。 在云原生CAx软件中,首先需要把系统按照…

MySQL锁详解及案例分析

MySQL锁详解及案例分析 一、一条update语句二、MySQL锁介绍三、全局锁全局锁演示1.环境准备2.全局锁演示 四、MySQL表级锁(都是Server层实现)1、表级锁介绍2、表读S、写锁X1)表锁相关命令2)表锁演示1、表级的共享锁(读锁)2、表级的…

VLAN实验

SW1 [sw1]int g0/0/2 [sw1-GigabitEthernet0/0/2]dis this interface GigabitEthernet0/0/2 port link-type access port default vlan 2 pc1划分到vlan 2 [sw1-GigabitEthernet0/0/3]dis t…

【C++STL】set

前言 前面的CSTL的博客,我们介绍了string,vector,list,deque,priority_queue还有stack和queue。 这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。 而从本节开…

【正点原子STM32精英V2开发板体验】体验LVGL的SD NAND文件系统

目的 验证基于SD NAND卡在正点原子STM32精英V2开发板上的兼容效果 实验材料 正点原子STM32精英V2开发板 TF 卡一片 SD NAND卡一片 实验步骤 1、打开例程【正点原子】精英STM32F103开发板 V2-资料盘(A盘)\4,程序源码\3,扩展例程\4,LVGL…

数据库系统概论(二)关系数据库,SQL概述和数据库安全性

作者的话 前言:总结下知识点,自己偶尔看一看。 目录 一、关系模型概述 1.1关系数据结构及形式化定义 1.1.1域(Domain) 1.1.2笛卡尔积(Cartesian Product) 1.1.3关系(Relation) …

Android之 WebView的使用

一 简介 1.1 WebView是用来展示网页的控件,底层是google的WebKit的引擎。 比起苹果的WebView,webkit一些不足地方: 不能支持word等文件的预览 纯标签加载,并不支持所有标签的加载 不支持文件的下载,图片的放大&#…

MATLAB连续时间信号的实现和时域基本运算(八)更新中...

1、实验目的: 1)熟悉常用连续时间信号的实现方法; 2)掌握连续时间信号的时域基本运算; 3)掌握实现基本函数及其运算的函数的使用方法; 4)加深对信号基本运算的理解。 2、实验内容&am…

Python Selenium 关键字驱动

目录 项目目录结构 action目录 config目录 exceptionpictures目录 log目录 testCases目录 testData目录 util目录 总结 之前写过一篇Java版的关键字驱动,现在来写一篇Python版本的,网上好多教程都是虎头蛇尾的不完整~ 说下思路,这边没…

十、ElasticSearch 实战 - 源码运行

一、概述 想深入理解 Elasticsearch,了解其报错机制,并有针对性的调整参数,阅读其源码是很有必要的。此外,了解优秀开源项目的代码架构,能够提高个人的代码架构能力 阅读 Elasticsearch 源码的第一步是搭建调试环境&…

C++的左值引用和右值引用

引用和指针的区别? 引用必须初始化,指针可以不初始化 定义一个指针和引用汇编指令上一样的,引用底层还是指针 引用只有一级引用,没有多级引用,而指针可以有多级指针 定义一个引用变量和指针变量,它们汇…

【c语言】函数指针详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

Android Framework—Service

介绍 Service是一种可以在后台执行长时间运行操作而不提供界面的应用组件。服务可以由其他应用组件启动&#xff0c;而且即使用户切换到其他应用&#xff0c;服务仍将在后台继续运行。此外&#xff0c;组件可以通过绑定到服务与之进行交互&#xff0c;甚至是执行进程之间的通信…

Unreal5 第三人称射击游戏 角色基础制作

快捷键 快捷键 ctrlE 可以快速打开相关蓝图类&#xff0c;直接在场景选中添加到场景中的对象即可。 调试蓝图 选中调试对象&#xff0c;选中需要调试的实例&#xff0c;即可查看当前角色的状态。 动画实例在运行的时候&#xff0c;也可以在右侧箭头获取当前场景已经生成的实…

Linux socket编程(二):多进程服务器

一、多进程服务器 最简单的的服务器程序执行流程为&#xff1a;创建socket → \rightarrow → 绑定监听的IP地址和端口 → \rightarrow → 监听客户端连接 → \rightarrow → 接受/发送数据。当服务端调用read阻塞等待一个客户端发来数据时&#xff0c;无法同时响应其它客户…

七、CANdelaStudio入门-Variant概念与应用

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Variant概念与应用,欢迎各位朋友订阅、…

Redis实现互相关注功能

Redis实现互相关注功能 我们要实现关注功能&#xff0c;首先&#xff0c;我们需要得到关注的目标ID&#xff1a; PutMapping("/{id}/{isFollow}")public Result followUser(PathVariable("id") Long id,PathVariable("isFollow") Boolean isFol…