iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >NumPy实现ndarray多维数组操作
  • 180
分享到

NumPy实现ndarray多维数组操作

2024-04-02 19:04:59 180人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index with slice boole

简介

NumPy一个非常重要的作用就是可以进行多维数组的操作,多维数组对象也叫做ndarray。我们可以在ndarray的基础上进行一系列复杂的数学运算。

本文将会介绍一些基本常见的ndarray操作,大家可以在数据分析中使用。

创建ndarray

创建ndarray有很多种方法,我们可以使用np.random来随机生成数据:


import numpy as np
# Generate some random data
data = np.random.randn(2, 3)
data

array([[ 0.0929,  0.2817,  0.769 ],
       [ 1.2464,  1.0072, -1.2962]])

除了随机创建之外,还可以从list中创建:


data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
array([6. , 7.5, 8. , 0. , 1. ])

从list中创建多维数组:


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

使用np.zeros创建初始值为0的数组:


np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

创建2维数组:


np.zeros((3, 6))
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])

使用empty创建3维数组:


np.empty((2, 3, 2))
array([[[0., 0.],
        [0., 0.],
        [0., 0.]],

       [[0., 0.],
        [0., 0.],
        [0., 0.]]])

注意,这里我们看到empty创建的数组值为0,其实并不是一定的,empty会从内存中随机挑选空间来返回,并不能保证这些空间中没有值。所以我们在使用empty创建数组之后,在使用之前,还要记得初始化他们。

使用arange创建范围类的数组:


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

指定数组中元素的dtype:


arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)

ndarray的属性

可以通过data.shape获得数组的形状。


data.shape
(2, 3)

通过ndim获取维数信息:


arr2.ndim
2

可以通过data.dtype获得具体的数据类型。


data.dtype
dtype('float64')

ndarray中元素的类型转换

在创建好一个类型的ndarray之后,还可以对其进行转换:


arr = np.array([1, 2, 3, 4, 5])
arr.dtype
dtype('int64')

float_arr = arr.astype(np.float64)
float_arr.dtype
dtype('float64')

上面我们使用astype将int64类型的ndarray转换成了float64类型的。

如果转换类型的范围不匹配,则会自动进行截断操作:


arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr.astype(np.int32)

array([ 3, -1, -2,  0, 12, 10], dtype=int32)

注意,这里是把小数截断,并没有向上或者向下取整。

ndarray的数学运算

数组可以和常量进行运算,也可以和数组进行运算:


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

arr * arr

array([[ 1.,  4.,  9.],
       [16., 25., 36.]])

arr + 10

array([[11., 12., 13.],
       [14., 15., 16.]])

arr - arr

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

1 / arr

array([[1.    , 0.5   , 0.3333],
       [0.25  , 0.2   , 0.1667]])

arr ** 0.5

array([[1.    , 1.4142, 1.7321],
       [2.    , 2.2361, 2.4495]])

数组之间还可以进行比较,比较的是数组中每个元素的大小:


arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])

arr2 > arr

array([[False,  True, False],
       [ True, False,  True]])

index和切片

基本使用

先看下index和切片的基本使用,index基本上和普通数组的使用方式是一样的,用来访问数组中某一个元素。

切片要注意的是切片后返回的数组中的元素是原数组中元素的引用,修改切片的数组会影响到原数组。


# 构建一维数组
arr = np.arange(10)

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

# index访问
arr[5]
5

# 切片访问
arr[5:8]
array([5, 6, 7])

# 切片修改
arr[5:8] = 12
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])

# 切片可以修改原数组的值
arr_slice = arr[5:8]
arr_slice[1] = 12345
arr

array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,
           9])

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

array([7, 8, 9])

# index 二维数组
arr2d[0][2]
3

# index二维数组
arr2d[0, 2]
3

# 构建三维数组
arr3D = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d

array([[[ 1,  2,  3],
        [ 4,  5,  6]],

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

# index三维数组
arr3d[0]

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

# copy是硬拷贝,和原数组的值相互不影响
old_values = arr3d[0].copy()
arr3d[0] = 42

arr3d

array([[[42, 42, 42],
        [42, 42, 42]],

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

arr3d[0] = old_values
arr3d

array([[[ 1,  2,  3],
        [ 4,  5,  6]],

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

# index 三维数组
arr3d[1, 0]

array([7, 8, 9])

x = arr3d[1]
x

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

x[0]

array([7, 8, 9])

index with slice

slice还可以作为index使用,作为index使用表示的就是一个index范围值。

作为index表示的slice可以有多种形式。

有头有尾的,表示index从1开始到6-1结束:


arr[1:6]
array([ 1,  2,  3,  4, 64])

无头有尾的,表示index从0开始,到尾-1结束:


arr2d[:2]
array([[1, 2, 3],
       [4, 5, 6]])

有头无尾的,表示从头开始,到所有的数据结束:


arr2d[:2, 1:]
array([[2, 3],
       [5, 6]])
arr2d[1, :2]
array([4, 5])

boolean index

index还可以使用boolean值,表示是否选择这一个index的数据。

我们先看下怎么构建一个boolean类型的数组:


names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
names == 'Bob'

array([ True, False, False,  True, False, False, False])

上面我们通过比较的方式返回了一个只包含True和False的数组。

这个数组可以作为index值来访问数组:


#  构建一个7 * 4 的数组
data = np.random.randn(7, 4)

array([[ 0.275 ,  0.2289,  1.3529,  0.8864],
       [-2.0016, -0.3718,  1.669 , -0.4386],
       [-0.5397,  0.477 ,  3.2489, -1.0212],
       [-0.5771,  0.1241,  0.3026,  0.5238],
       [ 0.0009,  1.3438, -0.7135, -0.8312],
       [-2.3702, -1.8608, -0.8608,  0.5601],
       [-1.2659,  0.1198, -1.0635,  0.3329]])

# 通过boolean数组来访问:
data[names == 'Bob']
array([[ 0.275 ,  0.2289,  1.3529,  0.8864],
       [-0.5771,  0.1241,  0.3026,  0.5238]])

索引行的时候,还可以索引列:


data[names == 'Bob', 3]
array([0.8864, 0.5238])

可以用 ~符号来取反:


data[~(names == 'Bob')]
array([[-2.0016, -0.3718,  1.669 , -0.4386],
       [-0.5397,  0.477 ,  3.2489, -1.0212],
       [ 0.0009,  1.3438, -0.7135, -0.8312],
       [-2.3702, -1.8608, -0.8608,  0.5601],
       [-1.2659,  0.1198, -1.0635,  0.3329]])

我们可以通过布尔型数组设置值,在实际的项目中非常有用:


data[data < 0] = 0
array([[0.275 , 0.2289, 1.3529, 0.8864],
       [0.    , 0.    , 1.669 , 0.    ],
       [0.    , 0.477 , 3.2489, 0.    ],
       [0.    , 0.1241, 0.3026, 0.5238],
       [0.0009, 1.3438, 0.    , 0.    ],
       [0.    , 0.    , 0.    , 0.5601],
       [0.    , 0.1198, 0.    , 0.3329]])

data[names != 'Joe'] = 7
array([[7.    , 7.    , 7.    , 7.    ],
       [0.    , 0.    , 1.669 , 0.    ],
       [7.    , 7.    , 7.    , 7.    ],
       [7.    , 7.    , 7.    , 7.    ],
       [7.    , 7.    , 7.    , 7.    ],
       [0.    , 0.    , 0.    , 0.5601],
       [0.    , 0.1198, 0.    , 0.3329]])

Fancy indexing

Fancy indexing也叫做花式索引,它是指使用一个整数数组来进行索引。

举个例子,我们先创建一个 8 * 4的数组:


arr = np.empty((8, 4))
for i in range(8):
    arr[i] = i
arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

然后使用一个整数数组来索引,那么将会以指定的顺序来选择行:


arr[[4, 3, 0, 6]]
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [0., 0., 0., 0.],
       [6., 6., 6., 6.]])

还可以使用负值来索引:


arr[[-3, -5, -7]]
array([[5., 5., 5., 5.],
       [3., 3., 3., 3.],
       [1., 1., 1., 1.]])

花式索引还可以组合来使用:


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

上面我们构建了一个8 * 4的数组。


arr[[1, 5, 7, 2], [0, 3, 1, 2]]
array([ 4, 23, 29, 10])

然后取他们的第2列的第一个值,第6列的第三个值等等。最后得到一个1维的数组。

数组变换

我们可以在不同维度的数组之间进行变换,还可以转换数组的轴。

reshape方法可以将数组转换成为任意的形状:


arr = np.arange(15).reshape((3, 5))
arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

数组还提供了一个T命令,可以将数组的轴进行对调:


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

对于高维数组,可以使用transpose来进行轴的转置:


arr = np.arange(16).reshape((2, 2, 4))
arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
        
arr.transpose((1, 0, 2))
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

上面的transpose((1, 0, 2)) 怎么理解呢?

其含义是将x,y轴对调,z轴保持不变。

上面我们通过使用reshape((2, 2, 4))方法创建了一个3维,也就是3个轴的数组。 其shape是 2 * 2 * 4 。

先看下对应关系:

(0,0)-》 [ 0, 1, 2, 3]

(0,1)-》 [ 4, 5, 6, 7]

(1,0)-》 [ 8, 9, 10, 11]

(1,1)-》 [12, 13, 14, 15]

转换之后:

(0,0)-》 [ 0, 1, 2, 3]

(0,1)-》 [ 8, 9, 10, 11]

(1,0)-》[ 4, 5, 6, 7]

(1,1)-》 [12, 13, 14, 15]

于是得到了我们上面的的结果。

多维数组的轴转换可能比较复杂,大家多多理解。

还可以使用 swapaxes 来交换两个轴,上面的例子可以重写为:


arr.swapaxes(0,1)

到此这篇关于NumPy实现ndarray多维数组操作的文章就介绍到这了,更多相关NumPy ndarray多维数组操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: NumPy实现ndarray多维数组操作

本文链接: https://www.lsjlt.com/news/126281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • NumPy实现ndarray多维数组操作
    目录简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index with slice boole...
    99+
    2022-11-12
  • NumPy实现多维数组中的线性代数
    目录简介图形加载和说明图形的灰度灰度图像的压缩原始图像的压缩总结简介 本文将会以图表的形式为大家讲解怎么在NumPy中进行多维数据的线性代数运算。 多维数据的线性代数通常被用在图像...
    99+
    2022-11-12
  • NumPy怎么实现多维数组中的线性代数
    本篇内容介绍了“NumPy怎么实现多维数组中的线性代数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录简介图形加载和说明图形的灰度灰度图像...
    99+
    2023-06-20
  • nditer—numpy.ndarray 多维数组的迭代操作
    1. Single array iteration >>> a = np.arange(6).reshape(2,3) >>> for x i...
    99+
    2022-11-12
  • python 将numpy维度不同的数组相加相乘操作
    第一种 np矩阵可以直接与标量运算 >>>import numpy as np >>>arr1 = np.arange(12).reshape...
    99+
    2022-11-11
  • php多维数组的底层实现
    随着互联网时代的发展,PHP语言在Web方面占据了举足轻重的地位。而多维数组作为PHP语言中最常用的数据结构之一,其在程序开发中具有重要的应用价值。本文将针对PHP多维数组的底层实现进行深入分析,以期为读者提供更加深入的了解。一、多维数组的...
    99+
    2023-05-19
  • Numpy三维数组索引与切片如何实现
    今天小编给大家分享一下Numpy三维数组索引与切片如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。这是一个三维数组,关...
    99+
    2023-07-05
  • PHP如何实现多维数组降级
    这篇文章将为大家详细讲解有关PHP如何实现多维数组降级,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。多维数组降级function array_flatten($arr) { ...
    99+
    2023-06-03
  • 下标操作符重载模拟多维数组详解
    最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!复制代码 代码如下:    template <typename T_CELL_STYLE...
    99+
    2022-11-15
    下标操作符重载 多维数组
  • python 实现二维数组的索引、删除、拼接操作
    1.数组的索引 我用的是iloc函数。导入数据是data,索引data.iloc[i,j],i代表行,j代表列。如果要索引i行之后的所有行元素,使用data.iloc[i:,j], i行之前的所有行,使用data.i...
    99+
    2022-06-02
    python 二维数组索引 二维数组删除 二维数组拼接
  • PHP中怎么实现多维数组排序
    这篇文章将为大家详细讲解有关PHP中怎么实现多维数组排序,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。根据数组的键进行比较大小,排序,就不用说了,php有很多,很方便的内置函数,krsort...
    99+
    2023-06-17
  • C#中的矩形数组(多维数组)和锯齿数组的实现
    目录(一)矩形数组(二)锯齿数组总结(一)矩形数组 在C#中,矩形数组(rectangular array),又称多维数组,是使用多个索引访问其元素的数组。 1. 二维数组的声明: ...
    99+
    2023-05-15
    C# 矩形数组 C# 锯齿数组 C# 多维数组
  • NumPy库在数据分析中的应用:实现高效的数组操作
    NumPy是Python中一个重要的数据分析库,它提供了高效的数组操作和数学函数库。在数据分析过程中,我们经常需要对大量的数据进行处理和计算,NumPy提供了高效的数据结构和算法来解决这些问题。本文将介绍NumPy库在数据分析中的应用,包...
    99+
    2023-11-09
    同步 numy 日志
  • Go语言中的框架是否支持多维数组操作?
    Go语言是一门快速发展的编程语言,因其高效和易用性而备受欢迎。在许多情况下,我们需要使用多维数组来处理数据,那么在Go语言中的框架是否支持多维数组操作呢?本文将深入探讨这个问题,并提供一些演示代码。 首先,我们需要了解Go语言中的多维数组。...
    99+
    2023-07-19
    关键字 框架 数组
  • 打包多个NumPy数组,Python中该如何实现?
    在Python中使用NumPy进行科学计算时,我们通常会处理多个数组。当需要将多个NumPy数组打包成一个数组时,我们可以使用NumPy库中的np.stack()函数。本文将详细介绍如何使用np.stack()函数打包多个NumPy数组。 ...
    99+
    2023-08-04
    numy 索引 打包
  • Numpy数组操作之元素添加、删除和修改怎么实现
    这篇文章主要介绍“Numpy数组操作之元素添加、删除和修改怎么实现”,在日常操作中,相信很多人在Numpy数组操作之元素添加、删除和修改怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Numpy数组操作...
    99+
    2023-07-05
  • PHP如何实现二维数组中行和列的替换操作
    PHP中使用二维数组十分常见,不过在进行一些操作时可能需要对二维数组的行或列进行替换。本文将介绍在PHP中如何实现二维数组的行和列的替换操作。一、PHP二维数组二维数组是由多个一维数组组成的数组,可以想象成是一个表格。在PHP中可以使用ar...
    99+
    2023-05-14
  • C#如何实现数组操作
    这篇文章给大家分享的是有关C#如何实现数组操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数组是相同类型的对象的集合。数组具有相同数据类型的项的有序集合。要访问数组中的某个项,需要同时使用数组名称及该项与数组起...
    99+
    2023-06-17
  • C语言多维数组数据结构怎么实现
    这篇文章主要介绍“C语言多维数组数据结构怎么实现”,在日常操作中,相信很多人在C语言多维数组数据结构怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言多维数组数据结构怎么实现”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • 使用numpy实现topk函数操作(并排序)
    np.argpartition 难以解决topK topK是常用的一个功能,在python中,numpy等计算库使用了丰富的底层优化,对于矩阵计算的效率远高于python的for-l...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作