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

Numpy用法(二)

一.数组变维

1.1 reshape

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

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

import numpy as npa = 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 npa = 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 npa = 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 npa = 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 npa = 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 npa = 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]]

# 降维不了的情况,即要删除的维度长度不为1a = 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 npa = 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 npa = np.array([[1, 2], [3, 4]])
print(np.linalg.det(a))

-2.0000000000000004


http://www.mrgr.cn/news/96314.html

相关文章:

  • Python每日一题(7)
  • SpringMVC 拦截器(Interceptor)
  • SpringCloud+Mybatis-Plus+Docker+RabbitMQ+Redis+Elasticsearch黑马商城
  • 大模型微调环境配置
  • Gateway实战(二)、负载均衡
  • 【云服务器】在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 Minecraft 服务器,并实现远程联机,详细教程
  • Nginx 优化
  • Java基础 3.28
  • C++指针(五)完结篇
  • 刘火良FreeRTOS内核实现与应用学习之6——多优先级
  • 从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档
  • 数据结构与算法:1,选择排序
  • 菜鸡前端计算机强基计划之CS50 第七课 python 入门—— Python 中文件操作专题学习
  • 基于SpringBoot的“交通旅游订票系统”的设计与实现(源码+数据库+文档+PPT)
  • linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像
  • 5.0 WPF的基础介绍1-Grid,Stack,button
  • flink 分组窗口聚合 与 窗口表值函数聚合 的区别
  • Codeforces Round 1013 (Div. 3)-F
  • 06-SpringBoot3入门-常见注解(简介)
  • 典范硬币系统(Canonical Coin System)→ 贪心算法