【NumPy】 ndarray对象创建、切片、复制、改变维度和数据类型

____tz_zs

之前把 numpy 资料写在了同一篇博客里,发现非常难以查阅,于是按功能切分开来。

https://blog.csdn.net/tz_zs/article/details/73929778

https://blog.csdn.net/tz_zs/article/details/80773612

https://blog.csdn.net/tz_zs/article/details/80775256

 

NumPy (Numeric Python) 是用Python实现的科学计算库,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。

包括:

1、一个强大的N维数组对象Array;

2、比较成熟的(广播)函数库;

3、用于整合C/C++和Fortran代码的工具包;

4、实用的线性代数、傅里叶变换和随机数生成函数。

NumPy 的操作对象是多维数组 ndarray,NumPy 的基本运算是以数组为对象进行基本运算,即向量化操作

 

延伸:【Python】array.array

Python 本身没有数组这个说法,有的就是 list 和 tuple, list 就具有其他语言中的数组特性。不过 python 有提供一个 array 模块,用于提供基本数字,字符类型的数组。用于容纳字符号、整型、浮点等基本类型。 这种模块主要用于二进制上的缓冲区,流的操作。

 

创建 ndarray 对象

np.array 构造数组

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np

# 构造整型数组
array_1 = np.array([1, 2, 3, 4, 5])
print(array_1)
print(array_1.dtype)
print(type(array_1))
'''
[1 2 3 4 5]
int32
<class 'numpy.ndarray'>
'''

# 构造浮点型数组
array_2 = np.array([1.1, 3., 3.14, 7.7])
print(array_2)
print(array_2.dtype)
print(type(array_2))
'''
[ 1.1   3.    3.14  7.7 ]
float64
<class 'numpy.ndarray'>
'''

# 构造32位浮点型数组
array_3 = np.array([1, 3, 5], dtype='float32')
print(array_3)
print(array_3.dtype)
print(type(array_3))
'''
[ 1.  3.  5.]
float32
<class 'numpy.ndarray'>
'''

# 构造一个嵌套列表结果的多维数组
array_4 = np.array([[i, i * i] for i in [5, 6, 7]])
print(array_4)
print(array_4.dtype)
print(type(array_4))
'''
[[ 5 25]
 [ 6 36]
 [ 7 49]]
int32
<class 'numpy.ndarray'>
'''

array_5 = np.array([[1, 2, 3, ], [4, 2, 3], [6, 2, 1]])
print(array_5)
print(array_5.dtype)
print(type(array_5))
'''
[[1 2 3]
 [4 2 3]
 [6 2 1]]
int32
<class 'numpy.ndarray'>
'''

np.arange() 创建数组

# -*- coding: utf-8 -*-
"""
@author: tz_zs

np.arange() 返回一个array对象
"""
import numpy as np

x = np.arange(9.).reshape(3, 3)
print(x)
'''
[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]]
'''

n1 = np.arange(6)
print(n1)  # [0 1 2 3 4 5]

# 构造一个 2 到 10 之间,步长为 2 的数组(左开右闭)
# n2 = np.arange(2, 10, 2)
n2 = np.arange(start=2, stop=10, step=2)
print(n2)  # [2 4 6 8]

另外:

 

属性

数组的维度:ndarray.ndim 或 np.ndim(ndarray)

数组的形状:ndarray.shape

数组的类型:ndarray.dtype

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""
@author:    tz_zs
"""
import numpy as np

n = np.zeros((2, 3))
print(n)
print(n.shape)
print(np.ndim(n))
print(n.ndim)
print(n.dtype)
"""
[[ 0.  0.  0.]
 [ 0.  0.  0.]]
(2, 3)
2
2
float64
"""

n2 = np.zeros((2, 3, 4), dtype=int)
print(n2)
print(n2.shape)
print(np.ndim(n2))
print(n2.ndim)
print(n2.dtype)
"""
 [[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]]
(2, 3, 4)
3
3
int64
"""

 

查询数组中的具体数据

获取某些行某些列

# -*- coding: utf-8 -*-
"""
@author: tz_zs
取数组中的值
"""
import numpy as np

array_1 = np.array([5, 10, 15])
print(array_1[1])
print(array_1[0:2])
'''
10
[ 5 10]
'''

array_2 = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
print(array_2[1, 2])  # 30
print(array_2[:, 1])  # [10 25 40]
print(array_2[:, 0:2])
'''
[[ 5 10]
 [20 25]
 [35 40]]
'''
print(array_2[1:3, 0:2])
'''
[[20 25]
 [35 40]]
'''

切片截取

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""
@author:    tz_zs
"""
import numpy as np

a = np.zeros((7, 7), dtype=int)
a[:2, :3] = 1
a[2:4, 2:4] = 2
a[4, 4] = 3
a[:, 5] = 4
a[[0, 2, 4, 6], 6] = 5
print(a)
"""
[[1 1 1 0 0 4 5]
 [1 1 1 0 0 4 0]
 [0 0 2 2 0 4 5]
 [0 0 2 2 0 4 0]
 [0 0 0 0 3 4 5]
 [0 0 0 0 0 4 0]
 [0 0 0 0 0 4 5]]
"""

条件筛选

#!/usr/bin/python2.7
# -*- coding:utf-8 -*-

"""
@author:    tz_zs
"""
import numpy as np

n = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [1, 3, 5, 7, 9]])
print(n)
"""
[[1 2 3 4 5]
 [2 3 4 5 6]
 [1 3 5 7 9]]
"""
# 比较所有的值,选择满足要求的值
r1 = n.copy()
print(r1 > 2)
"""
[[False False  True  True  True]
 [False  True  True  True  True]
 [False  True  True  True  True]]
"""
r1[r1 > 2] = 11
print(r1)
"""
[[ 1  2 11 11 11]
 [ 2 11 11 11 11]
 [ 1 11 11 11 11]]
"""

# 比较某一列中的值,选择满足要求的那一行
r2 = n.copy()
b = r2[:, 4] > 6
print(b)
"""
[False False  True]
"""
r2[b] = 11
print(r2)
"""
[[ 1  2  3  4  5]
 [ 2  3  4  5  6]
 [11 11 11 11 11]]
"""

# 比较某一行中的值,选择满足要求的那一列
r3 = n.copy()
b = r3[1, :] > 4
print(b)
"""
[False False False  True  True]
"""
r3[:, b] = 11
print(r3)
"""
[[ 1  2  3 11 11]
 [ 2  3  4 11 11]
 [ 1  3  5 11 11]]
"""

 

复制数组 copy

ndarray.copy()

判断 ndarray 中的值是否等于/大于/小于某个值

  • 对 ndarray 进行的操作,会对其中的每个元素进行操作

复制 ndarray 对象

  • n2 = n1只会复制地址值,指向同一个对象
  • n2 = n1.view() 浅复制 虽然是不同的对象,不同的id,但他们共用了一套值
  • ndarray.copy() 复制 ndarray 对象
# -*- coding: utf-8 -*-
"""
@author: tz_zs
判断 ndarray 中的值是否等于/大于/小于
对 ndarray 进行的操作,会对其中的每个元素进行操作


复制 ndarray 对象
n2 = n1只会复制地址值,指向同一个对象
n2 = n1.view() 浅复制 虽然是不同的对象,不同的id,但他们共用了一套值
ndarray.copy() 复制 ndarray 对象
"""
import numpy as np

n1 = np.array([5, 10, 15, 20])
print(n1 == 10)
# [False  True False False]

n2 = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
print(n2 >= 25)
'''
[[False False False]
 [False  True  True]
 [ True  True  True]]
'''
print((n2 == 10) | (n2 == 25))
'''
[[False  True False]
 [False  True False]
 [False False False]]
'''

# 可以使用 bool 值当索引
n_bool = (n2 == 10) | (n2 == 25) | (n2 == 45)
print(n_bool)
'''
[[False  True False]
 [False  True False]
 [False False  True]]
'''
print(n2[n_bool])
# [10 25 45]

n3 = n2.copy()  # 复制一个 ndarray 对象,n3 和 n2 的地址 id 不一样
n3[n_bool] = 100
print(n2)
'''
[[ 5 10 15]
 [20 25 30]
 [35 40 45]]
'''
print(n3)
'''
[[  5 100  15]
 [ 20 100  30]
 [ 35  40 100]]
'''

·

修改数组维度

  • ndarray.shape=(值) 直接赋值修改 shape
  • ndarray.reshape()    有返回值,不会修改原对象,而是返回一个新的
  • ndarray.resize()        无返回值,在原对象上进行修改
  • ndarray..ravel()        拉平,变为一维数组。
  • ndarray.T()                转置

.

# -*- coding: utf-8 -*-
"""
@author: tz_zs

更改维度
直接修改 shape
ndarray.reshape() 有返回值,不会修改原对象,而是返回一个新的
ndarray.resize() 无返回值,在原对象上进行修改
ndarray..ravel() 拉平,变为一维数组。

ps:(8, ) ≠ (8, 1):前者表示一维数组(无行和列的概念),后者则表示一个特殊的二维数组,也即是一个列向量;
"""

import numpy as np

# 构造数组
n1 = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(n1)  # [1 2 3 4 5 6 7 8]
# 查看数组的维度
print(n1.shape)  # (8,)
# 维度大小
print(n1.ndim)  # 1
# 类型
print(n1.dtype)  # int32

####### reshape #######
# 更改数组的维度为 (2, 4)
print('n2', '-' * 10)
n2 = n1.reshape(2, 4)
# n2 = n1.reshape(2, -1) # -1 代表让系统自己计算,因为确定前一个维度,第二个维度的值本身就已经确定了
print(n2)
print(n2.shape)
print(n2.ndim)
print(n2.dtype)
"""
[[1 2 3 4]
 [5 6 7 8]]
(2, 4)
2
int32
"""

####### 直接修改 shape #######
n2.shape = (8)
print(n2)
print(n2.shape)
print(n2.ndim)
print(n2.dtype)
'''
[1 2 3 4 5 6 7 8]
(8,)
1
int32
'''

# 更改数组的维度为 (2, 2, 2)
print('n3', '-' * 10)
# n3 = n1.reshape(2, 2, 2)
n3 = n1.reshape(2, 2, -1)  # -1 代表让系统自己计算,因为确定前两个维度,第三个维度的值本身就已经确定了
print(n3)
print(n3.shape)
print(n3.ndim)
print(n3.dtype)
'''
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]
(2, 2, 2)
3
int32
'''

####### ravel #######
# 拉平,变为一维
print('n4', '-' * 10)
n4 = n3.ravel()
print(n4)
print(n4.shape)
'''
[1 2 3 4 5 6 7 8]
(8,)
'''

####### resize #######
# ndarray.resize() 无返回值,在原对象上进行修改
n5 = n3.resize(2, 4)
print(n3)
print(n5)
'''
[[1 2 3 4]
 [5 6 7 8]]
None
'''

.

修改数据类型 astype

ndarray.astype()

# -*- coding: utf-8 -*-
"""
@author: tz_zs

ndarray.astype()方法来转换数组的数据类型
"""

import numpy as np

n = np.array(['1', '2', '3', '4'])
print(n.dtype)  # <U1
print(n)  # ['1' '2' '3' '4']

n2 = n.astype(float)
print(n2.dtype)  # float64
print(n2)  # [ 1.  2.  3.  4.]

end

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值