当前位置: 首页 > news >正文

Numpy用法(二)

一.数组变维

1.1 reshape

reshape() 可以改变数组维度,但是返回的是一个新的数组,原数组的形状不会被修改.reshape后产生的新数组是原数组的一个视图,即它与原数组共享相同的数据,但可以有不同的形状或维度,且对视图的修改会直接影响原数组数据。

元素总数必须匹配:新形状中的元素总数必须与原数组中的元素总数相同,即(2,3)可以改成(3,2)而不能是(2,2)

import numpy as np

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

# 进行变维
b = a.reshape(3,2)

print(a)

# 换个行
print()


print(b)

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

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

# 试试将一维变成三维
import numpy as np

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

b = a.reshape(2,2,3)


print(a)
print()
print(b)

[ 1  2  3  4  5  6  7  8  9 10 11 12]

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

 [[ 7  8  9]
  [10 11 12]]]

事实确实证明,只要两个形状里元素个数一致,形状怎么变,或者改变维度也可以。

-1 作为占位符:

你可以使用 -1 作为占位符,让 numpy 自动计算某个维度的大小。也就是-1在哪,就会自动改变那个行或列的大小以适配新的形状。

import numpy as np

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

b = a.reshape(3,-1)
print(b)

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

1.2 flat

返回一个一维迭代器,用于遍历数组中的所有元素。

import numpy as np

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

# 创建flat
b = a.flat
for i in b:
    print(i)

1
2
3
4
5
6

1.3 flatten()

用于将多维数组转换为一维数组,返回的也是一个副本

ndarray.flatten(order='C')

- 'C':按行优先顺序展开(默认)。

- 'F':按列优先顺序展开。

- 'A':如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。

- 'K':按元素在内存中的顺序展开。

import numpy as np

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

b = a.flatten()
print(b)

[1 2 3 4 5 6]

1.4 ravel()

ndarray.ravel()

- 'C':按行优先顺序展开(默认)。

- 'F':按列优先顺序展开。

- 'A':如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。

- 'K':按元素在内存中的顺序展开。

其用于将多维数组转换为一维数组。与 flatten() 不同,ravel() 返回的是原数组的一个视图(view),而不是副本。因此,对返回的数组进行修改会影响原数组数据。

import numpy as np

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

b = a.ravel()
print(b)

b[0] = 100
print(a)

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

二.数组转置

transpose

将数组的维度值进行对换

比如二维数组维度(2,4)使用该方法后为(4,2)

ndarray.T与 transpose 方法相同
import numpy as np 
# x.T
a = np.arange(1,7).reshape(2,3)
print(a)

print()

print(a.T)

print()

# transpose()
print(np.transpose(a))

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

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

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

三.升维和降维

        多维数组(也称为 ndarray)的维度(或轴)是从外向内编号的。这意味着最外层的维度是轴0,然后是轴1,依此类推。

        比如[ [ [ 1,2,3 ] ] ],最外面那层括号就是轴0,也就是最外层维度,该形状为(1,1,3)。维度长度分别为1,1,3。

expand_dims(arr, axis)

arr:输入数组

axis:新轴插入的位置

在指定位置插入新的轴(相对于结果数组而言),从而扩展数组的维度
squeeze(arr, axis)

arr:输入数组

axis:取值为整数或整数元组,用于指定需要删除的维度所在轴,指定的维度值必须为 1 ,否则将会报错,若为 None,则删除数组维度中所有为 1 的项

删除数组中维度为 1 的项
import numpy as np
# 升维
a = np.array([1, 2, 3])
print(a.shape)

# 在轴0即 行上升维
b = np.expand_dims(a, axis=0)
print(b.shape)
print(b)


# 换个行
print()

# 在轴1即 列上升维
c = np.expand_dims(a, axis=1)
print(c.shape)
print(c)


# 换个行
print()

# 在原来轴1的位置上再升维
d = np.expand_dims(c, axis=1)
print(d.shape)
print(d)
# 注意,这里的1是加在(3,1)中间的

(3,)
(1, 3)
[[1 2 3]]

(3, 1)
[[1]
 [2]
 [3]]

(3, 1, 1)
[[[1]]

 [[2]]

 [[3]]]

        你可以这样理解,按轴0升维是在最外层加上俩括号,按最大轴升维是在最内层元素两旁加上俩括号。

import numpy as np
# 降维
a = np.array([[[1, 2, 3]]])

# 删除最外层维度即最外层括号
b = np.squeeze(a, axis = 0)
print(b)

[[1 2 3]]

# 降维不了的情况,即要删除的维度长度不为1

a = np.array([1, 2, 3])
a.shape = (3, 1)
print(a)

np.squeeze(a,axis=0)

[[1]
 [2]
 [3]]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[31], line 7
      4 a.shape = (3, 1)
      5 print(a)
----> 7 np.squeeze(a,axis=0)

File c:\Users\Clocky7\anaconda3\envs\pyhon-numpy\lib\site-packages\numpy\core\fromnumeric.py:1558, in squeeze(a, axis)
   1556     return squeeze()
   1557 else:
-> 1558     return squeeze(axis=axis)

ValueError: cannot select an axis to squeeze out which has size not equal to one

四.连接数组

hstack(tup)

tup:可以是元组,列表,或者numpy数组返回结果为numpy的数组

按水平顺序堆叠序列中数组(列方向)
vstack(tup)tup:可以是元组,列表,或者numpy数组,返回结果为numpy的数组按垂直方向堆叠序列中数组(行方向)

        其上分别要求行数一致和列数一致,而且vstack() 和 hstack() 要求堆叠的数组在某些维度上具有相同的形状,否则无法堆叠。

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


# vstack
print(np.vstack((a, b)))

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

五.分割数组

hsplit(ary, indices_or_sections)

ary:原数组 indices_or_sections:

按列分割的索引位置

将一个数组水平分割为多个子数组

(按列)

vsplit(ary, indices_or_sections)

ary:原数组 indices_or_sections:

按行分割的索引位置

将一个数组垂直分割为多个子数组

(按行)

import numpy as np

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

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

六.矩阵运算

6.1 np.dot

是一个通用的点积函数,适用于多种维度的数组。

- 对于二维数组(矩阵),np.dot 等价于矩阵乘法。

- 对于一维数组(向量),np.dot 计算的是向量的点积(内积)。

# 点积
a = numpy.array([1, 2, 3])
b = numpy.array([4, 5, 6])
print(numpy.dot(a, b))

32

# 矩阵乘法
a = numpy.array([[1, 2],[3, 4]])
b = numpy.array([[5, 6],[7, 8]])
print(numpy.dot(a, b))

[[19 22]
 [43 50]]

6.2 np.matmul

是专门用于矩阵乘法的函数,适用于二维及更高维度的数组。np.dot是通用点积函数,np.matmul专门用于矩阵运算,性能要好于np.dot

6.3 np.linalg.det

求方阵行列式

import numpy as np

a = np.array([[1, 2], [3, 4]])
print(np.linalg.det(a))

-2.0000000000000004

相关文章:

  • 大语言模型(LLM)应用开篇 | RAG方法论概述 | 构建知识库探索
  • 【环路补偿】环路补偿的九种类型-mathcad计算书免费下载
  • 怎么对asp.web api进行单元测试?
  • LLM模型微调方法
  • 高压NPN
  • 【大模型基础_毛玉仁】5.2 模型编辑经典方法
  • 记一次系统单点登录、模拟web系统登录方式的开发过程,使用AES加密
  • JavaScript中的Web Workers
  • Eplan许可管理与其他PLM工具的集成
  • Activity 避免销毁重建的方案
  • 跨境电商封号的根源分析:AI反检测技术的应对策略
  • 大模型(LLMs)微调面
  • TF-IDF——自然语言处理——红楼梦案例
  • nginx配置页面缓存,前端每次打包生成新的js文件
  • docker安装mongoDB
  • 卷积神经网络的传播及参数用法
  • 【React】基于 React+Tailwind 的 EmojiPicker 选择器组件
  • 第R9周:阿尔兹海默症诊断(优化特征选择版)
  • 小林coding-10道Java集合面试题
  • 基础认证-单选题(三)
  • 新华每日电讯:博物馆正以可亲可近替代“高冷范儿”
  • 世界高血压日|专家:高血压患者控制血压同时应注重心率管理
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 卿晨璟靓等用服刑经历“引流”,专家:将犯罪问题娱乐化会消解刑罚严肃性
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应
  • “80后”德州市接待事务中心副主任刘巍“拟进一步使用”