Python<Numpy常见用法>

本文详细介绍了NumPy中数组的基本操作,包括数据类型查看、数组形状修改、索引切片、数组转置、数组组合与切割等核心功能,并提供了丰富的实例代码。此外,还讲解了如何使用NumPy读取CSV文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基本数据类型
这里写图片描述

2.修改shape

In [18]: y=np.arange(2*3*4)

In [19]: y
Out[19]:
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])

In [20]: y.shape=(3,8)

In [21]: y
Out[21]:
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]])

In [22]: y.shape=(2,3,4)

In [23]: y
Out[23]:
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]]])

3.itemsize查看数据类型在内存中占用的字节数

In [36]: a=np.array(5,dtype=np.float)

In [37]: a
Out[37]: array(5.0)

In [38]: a.dtype
Out[38]: dtype('float64')

In [39]: a.dtype.itemsize
Out[39]: 8

In [40]: a=np.array(5,dtype=np.float16)

In [41]: a.dtype.itemsize
Out[41]: 2

4.切片索引固定步长选择元素

In [46]: a[:7:2]
Out[46]: array([0, 2, 4, 6])

In [47]: a[:7:3]
Out[47]: array([0, 3, 6])

In [48]: a=np.arange(9)

In [49]: a[:7:2]
Out[49]: array([0, 2, 4, 6])

In [50]: a[:7:3]
Out[50]: array([0, 3, 6])

5.指定间隔翻转数组

In [46]: a[:7:2]
Out[46]: array([0, 2, 4, 6])

In [47]: a[:7:3]
Out[47]: array([0, 3, 6])

In [48]: a=np.arange(9)

In [49]: a[:7:2]
Out[49]: array([0, 2, 4, 6])

In [50]: a[:7:3]
Out[50]: array([0, 3, 6])

6.选取N维数组中的指定元素

In [55]: b=np.arange(24).reshape(2,3,4)

In [56]: b
Out[56]:
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]]])

In [57]: b[0]
Out[57]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [58]: b[:,0]
Out[58]:
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15]])

In [59]: b[:,:,0]
Out[59]:
array([[ 0,  4,  8],
       [12, 16, 20]])
#另外一种方法
In [60]: b[...,0]
Out[60]:
array([[ 0,  4,  8],
       [12, 16, 20]])

7.改变数组的维度

In [61]: b
Out[61]:
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]]])
#返回一个原数组的view
In [62]: b.ravel()
Out[62]:
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])

In [63]: b
Out[63]:
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]]])
#flatten()重新申请内存保存结果
In [64]: b.flatten()
Out[64]:
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])

In [65]: b
Out[65]:
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]]])
In [66]: b.shape=(4,6)

In [67]: b
Out[67]:
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]])

8.数组转置

In [70]: b.T
Out[70]:
array([[ 0,  6, 12, 18],
       [ 1,  7, 13, 19],
       [ 2,  8, 14, 20],
       [ 3,  9, 15, 21],
       [ 4, 10, 16, 22],
       [ 5, 11, 17, 23]])

In [71]: b.transpose()
Out[71]:
array([[ 0,  6, 12, 18],
       [ 1,  7, 13, 19],
       [ 2,  8, 14, 20],
       [ 3,  9, 15, 21],
       [ 4, 10, 16, 22],
       [ 5, 11, 17, 23]])

9.reshape和resize
后者直接修改源数组

In [75]: b.reshape(2,3,4)
Out[75]:
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]]])

In [76]: b
Out[76]:
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]])

In [77]: b.resize(2,3,4)

In [78]: b
Out[78]:
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]]])

10.数组组合

水平组合

这里写图片描述

In [14]: a
Out[14]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [15]: b
Out[15]:
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

In [16]: np.hstack((a,b))
Out[16]:
array([[ 0,  1,  2,  0,  2,  4],
       [ 3,  4,  5,  6,  8, 10],
       [ 6,  7,  8, 12, 14, 16]])

In [17]: np.concatenate((a,b),axis=1)
Out[17]:
array([[ 0,  1,  2,  0,  2,  4],
       [ 3,  4,  5,  6,  8, 10],
       [ 6,  7,  8, 12, 14, 16]])

concatenate的axis的要么是0要么是1,前者竖向组合,后者水平组合

垂直组合

In [18]: np.vstack((a,b))
Out[18]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

In [20]: np.concatenate((a,b),axis=0)
Out[20]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

深度组合

In [24]: a
Out[24]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [25]: b
Out[25]:
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

In [26]: np.dstack((a,b))
Out[26]:
array([[[ 0,  0],
        [ 1,  2],
        [ 2,  4]],

       [[ 3,  6],
        [ 4,  8],
        [ 5, 10]],

       [[ 6, 12],
        [ 7, 14],
        [ 8, 16]]])

还可以这么玩:


In [38]: a=np.arange(10)

In [39]: b=a*3

In [40]: b
Out[40]: array([ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27])

In [41]: np.stack((a,b),axis=0)
Out[41]:
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27]])

In [42]: np.stack((a,b),axis=1)
Out[42]:
array([[ 0,  0],
       [ 1,  3],
       [ 2,  6],
       [ 3,  9],
       [ 4, 12],
       [ 5, 15],
       [ 6, 18],
       [ 7, 21],
       [ 8, 24],
       [ 9, 27]])

行组合:

In [43]: a
Out[43]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [44]: b
Out[44]: array([ 0,  3,  6,  9, 12, 15, 18, 21, 24, 27])

In [45]: np.column_stack((a,b))
Out[45]:
array([[ 0,  0],
       [ 1,  3],
       [ 2,  6],
       [ 3,  9],
       [ 4, 12],
       [ 5, 15],
       [ 6, 18],
       [ 7, 21],
       [ 8, 24],
       [ 9, 27]])




In [48]: a=np.arange(9).reshape(3,3)

In [49]: a
Out[49]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [50]: b=a*2

In [51]: b
Out[51]:
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

In [52]: np.column_stack((a,b))
Out[52]:
array([[ 0,  1,  2,  0,  2,  4],
       [ 3,  4,  5,  6,  8, 10],
       [ 6,  7,  8, 12, 14, 16]])


In [56]: np.column_stack((a,b))==np.hstack((a,b))
Out[56]:
array([[ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True]], dtype=bool)

行组合

In [57]: np.row_stack((a,b))
Out[57]:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

In [58]: np.row_stack((a,b))==np.vstack((a,b))
Out[58]:
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

11.数组切割

In [61]: a
Out[61]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [62]: np.hsplit(a,3)
Out[62]:
[array([[0],
        [3],
        [6]]), 
 array([[1],
        [4],
        [7]]),
 array([[2],
        [5],
        [8]])]

垂直切割:

In [67]: np.vsplit(a,3)
Out[67]: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

深度切割

In [70]: c
Out[70]:
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]]])

In [71]: np.dsplit(c,3)
Out[71]:
[array([[[ 0],
         [ 3],
         [ 6]],

        [[ 9],
         [12],
         [15]],

        [[18],
         [21],
         [24]]]), array([[[ 1],
         [ 4],
         [ 7]],

        [[10],
         [13],
         [16]],

        [[19],
         [22],
         [25]]]), array([[[ 2],
         [ 5],
         [ 8]],

        [[11],
         [14],
         [17]],

        [[20],
         [23],
         [26]]])]

12.数组属性
ndim属性,给出数组的维数,或数组轴的个数:

In: b
Out:
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]])
In: b.ndim
Out: 2

size属性,给出数组元素的总个数,如下所示:

In: b.size
Out: 24

itemsize属性,给出数组中的元素在内存中所占的字节数:

In: b.itemsize
Out: 8

如果你想知道整个数组所占的存储空间,可以用nbytes属性来查看。这个属性的值其实
就是itemsize和size属性值的乘积:

In: b.nbytes
Out: 192
In: b.size * b.itemsize
Out: 192 

13.读取CSV文件

#!/usr/bin/python
# coding=UTF-8
import numpy as np
#读取整个文件夹的内容delimiter指定文件中的分隔符,dtype指定类型
content=np.loadtxt('data.csv', delimiter=',',dtype=str)
print content
print '第一行第一个元素:'
print content[0][0]


#读取指定列,unpack参数设置为True,意思是分拆存储不同列的数据
one,two=np.loadtxt('data.csv',delimiter=',',dtype=str,usecols=(0,1),unpack=True)
print one,two
print one[0]

#读取整个文件夹的内容delimiter指定文件中的分隔符,dtype指定类型
content=np.genfromtxt('data.csv',delimiter=',',dtype=str)
print content

one,two=np.genfromtxt('data.csv',delimiter=',',usecols=(0,1),unpack=True,dtype=str)
print one,two
<think>好的,我现在要解决用户关于Pythonnumpy版本范围的问题。用户问的是“python numpy version range <2.2 >=1.24 explanation”,需要解释这个版本范围的意义。首先,我需要确认版本范围的表示方法是否正确。通常在Python中,版本号使用PEP 440规范,版本范围可以用不等式组合,比如>=1.24, <2.2.0。用户写的“<2.2 >=1.24”可能是指版本大于等于1.24且小于2.2。不过需要注意,版本号通常由主版本、次版本和微版本组成,比如2.2.0,所以正确的范围应该是<2.2.0,而不仅仅是2.2,因为2.2可能指的是2.2.0。不过用户可能简化了写法,我需要按常见的情况来解释。 接下来,我需要解释每个部分的含义。>=1.24表示最低支持的版本是1.24.0,包括该版本及更高版本。而<2.2.0则是指排除2.2.0及更高版本,只接受2.1.x及以下的版本。这样做的目的是为了兼容性,确保使用的numpy版本在1.242.2之间,但不包括2.2。可能的原因包括API的变化,在2.2版本中可能有破坏性更新,导致旧代码不兼容,所以限制在2.2之前。 然后,我需要考虑用户为什么会遇到这样的版本要求。比如,在安装某些依赖包时,项目可能指定了这样的版本范围,以确保依赖的稳定性。例如,用户提到的引用[2]中使用了np.random.choice,可能在numpy的不同版本中函数的行为有所变化,所以需要固定版本。 此外,还要说明如何在实际中应用这个版本约束,比如在requirements.txt中写numpy>=1.24, <2.2,或者使用pip安装时指定版本范围。同时提醒用户注意,当使用这样的范围时,应测试不同版本下的兼容性,尤其是接近上限的版本,如2.1.x,以确保没有意外的问题。 最后,可能需要补充一些常见问题,比如如何检查当前安装的numpy版本,如何升级或降级版本,以及如何解决版本冲突等问题。比如用户可以通过pip show numpy查看版本,或者使用pip install "numpy>=1.24, <2.2"来安装符合条件的版本。</think>关于PythonNumPy版本范围`>=1.24, <2.2`的解释如下: ### 1. 版本范围的含义 - **`>=1.24`**: 表示最低支持的NumPy版本是`1.24.0`,所有更高版本(如1.24.11.25.02.0.0等)均被包含。 - **`<2.2`**: 表示排除`2.2.0`及更高版本,允许的版本上限是`2.1.x`(如2.1.02.1.5等)。 ### 2. 版本约束的作用 - **兼容性保障**:此范围确保代码或依赖包在`1.24.0`到`2.1.x`之间稳定运行,避免因版本升级引入破坏性变更[^1]。 - **安全边界**:某些功能(如`np.random.choice`的行为)可能在特定版本中变化,版本限制可减少意外错误[^2]。 ### 3. 典型应用场景 - **项目依赖声明**:在`setup.py`或`requirements.txt`中指定版本范围,例如: ```python install_requires=["numpy>=1.24, <2.2"] ``` - **环境配置**:通过`pip`安装时明确版本: ```bash pip install "numpy>=1.24, <2.2" ``` ### 4. 注意事项 - **版本号规范**:遵循[语义化版本(SemVer)](https://semver.org/),主版本号变更(如`2.0.0`)可能包含不兼容的API修改。 - **测试覆盖**:建议在CI/CD中测试边界版本(如1.24.02.1.0),确保兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值