Python数据分析系列(四 ):python数据结构 — Numpy中的ndarray(数组)的使用


前言

本文主要介绍 Numpy中的ndarray(数组)的使用,其中包括用于数组创建,常用的数组算法(如排序集合运算),数组描述统计,数据聚合或分组运算,数据集的合并/连接运算的数据对齐和关系型数据运算等等。


一、NumPy是什么?

NumPy(Numerical Python的简称)是高性能科学计算和数学分析的基础包。有以下特征:

  • 强大的ndarray对象和ufunc函数
  • 精巧的函数
  • 比较适合线性代数随机数处理等科学计算
  • 有效的通用多维数据,可定义任意数据类型
  • 无缝对接数据库

二、python中的数组

1.python中数组的形式

  • 用list和tuple等数据结构表示数组
import numpy as np
list1=[1,2,3,4]
x=np.array(list1)

import numpy as np
list2=[[1,2,3],[4,5,6],[7,8,9]]
x=np.array(list2)
  • array模块
    • 通过array函数创建数组
    • 提供append、insert和read等方法
import array
array.array("B",range(5))
# 输出:
# array('B', [0, 1, 2, 3, 4])

三、NumPy的ndarray

1.ndarray是什么?

  • 一种N维数组。
  • Numpy中基本的数据结构
  • 所有元素是同一种类型
  • 别名array
  • 利于节省内存和提高CPU计算时间
  • 有丰富的函数

2.ndarray基本概念

数组属性

  • 维度(dimensions)称为轴(axes),轴的个数称为秩(rank)。
  • 基本属性
    • ndarray.ndim
      返回数组的秩。
    • ndarray.shape
      返回数组的维度。
    • ndarray.size
      返回数组的元素总个数。
    • ndarray.dtype
      返回数组的元素类型。
    • ndarray.itemsize
      返回数组的元素字节大小。
import numpy as np
x=np.array([(1,2,3),(4,5,6)])

print("数组的秩",x.ndim)
# 输出:
# 数组的秩 2

print("数组的维度",x.shape)
# 输出:
# 数组的维度 (2, 3)

print("数组的元素总个数",x.size)
# 输出:
# 数组的元素总个数 6

print("数组的元素类型",x.dtype)
# 输出:
# 数组的元素类型 int32

print("数组的元素字节大小",x.itemsize)
# 输出:
# 数组的元素字节大小 4

3.ndarray的创建函数

  • numpy.array(object, dtype=None*, copy=True, order=‘K’, subok=False, ndmin=0,like=None)

创建数组

参数解释:

object:创建数组的对象,可以是一切序列对象,可以是单个值,列表,元胞等。
dtype:创建数组中的数组类型。

import numpy as np
aArray=np.array([1,2,3])
aArray
# 输出:
# array([1, 2, 3])

bArray=np.array([(1,2,3),(4,5,6)])
bArray
# 输出:
# array([[1, 2, 3],
#       [4, 5, 6]])

cArray=np.array([(1,2,3),(4,5,6)],dtype=np.float32)
cArray
# 输出:
# array([[1., 2., 3.],
#       [4., 5., 6.]], dtype=float32)
  • numpy.arange(arange([start,] stop[, step,], dtype=None, *, like=None)

创建返回间隔类均匀分布的数组。

参数解释:

start:可选,起点值,默认从0开始。
stop:必需,终点值,生成元素不包括结束值。
step:可选,步长,默认步长为1。
dtype:可选,默认为None,设置显示元素的数据类型。

import numpy as np

np.arange(7) # 终点值为7,默认起点值为0,步长为1
# 输出:
# array([0, 1, 2, 3, 4, 5, 6])

np.arange(3,7) # 终点值为7,起点值为3,步长为1
# 输出:
# array([3, 4, 5, 6])

np.arange(3,7,2) # 终点值为7,起点值为3,步长为2
# 输出:
# array([3, 5])

np.arange(3,7,0.5) # 终点值为7,起点值为3,步长为0.5
# 输出:
# array([3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5])
  • numpy.copy(a, order=‘K’, subok=False)

深拷贝,对新生成的对象修改删除操作不会影响到原对象。

参数解释:

a:一个数组。
order:可选。{‘C’, ‘F’, ‘A’, ‘K’},{‘C’,‘F’}是否在内存中以C或fortran(行或列)顺序复制多维数据。

import numpy as np
a=np.arange(12)
b=a  #对象复制,a,b地址一样
b.shape=(3,4) #a对象的shape也会变化
print(a,id(a))
# 输出:
# [[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]] 2049516001296

print(b,id(b))
# 输出:
# [[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]] 2049516001296

import numpy as np
a=np.arange(12)
d=np.copy(a)
d.shape=(3,4)
print(a,id(a))
# 输出:
# [ 0  1  2  3  4  5  6  7  8  9 10 11] 2049516002544

print(d,id(d))
# 输出:
# [[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]] 2049516000816

关于浅、深拷贝的可以参考文章:https://blog.csdn.net/sodaloveer/article/details/134968124

  • numpy.empty(shape,dtype=float,order=‘C’)

根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化,生成的数组元素为随机数

参数解释:

shape:整数或者整数组成的数组。
dtype:数据类型,可选。指定输出数组的数值类型,例如numpy.int8,默认为numpy.float64。
order:可选。{‘C’,‘F’}是否在内存中以C或fortran(行或列)顺序存储多维数据。

import numpy as np
np.empty([2,3])
# 输出:
# array([[2.12199579e-314, 6.36598737e-314, 1.06099790e-313],
#       [1.48539705e-313, 1.90979621e-313, 2.33419537e-313]])
np.empty([2, 3], dtype=int)
# 输出:
# array([[1065353216, 1073741824, 1077936128],
#       [1082130432, 1084227584, 1086324736]])
  • numpy.empty_like(prototype, dtype=None, order=‘K’, subok=True, shape=None)

返回与已有数组相同维度及类型的新数组。

参数解析:

prototype:数组,原型的形状和数据类型定义了返回数组的相同属性。
dtype:数据类型,可选。指定输出数组的数值类型。
order:可选。{‘C’, ‘F’, ‘A’, or ‘K’}。覆盖结果的内存布局。
subok:布尔值,可选。如果为True,那么新建的数组将使用sub-class类型的原型,否则它将是base-class数组。默认为True。
shape:int或整数序列,可选。覆盖结果的形状,如果order='K’且维数不变,将尝试保持order,否则,隐含order=‘C’。

import numpy as np
a=np.arange(9).reshape(3,3)
np.empty_like(a)
# 输出:
# array([[712861296,       477,         0],
#       [        0,       960,         0],
#       [      768,         0,         0]])

np.empty_like(a,dtype=np.float32)
# 输出:
# array([[1.36e-43, 6.45e-44, 1.40e-43],
#       [1.63e-43, 1.70e-43, 1.57e-43],
#       [1.42e-43, 6.68e-43, 0.00e+00]], dtype=float32)
  • numpy.eye(N, M=None, k=0, dtype=<class ‘float’>, order=‘C’, *, like=None)

返回一个对角线是1,其他是0的二维数组。

参数解析

N:int,输出中的行数。
M:int,可选。输出中的列数,默认值为’N’。
K:int,可选。对角线的索引,默认值为0,表示是主对角线,正值指的是上对角线,负值指的是下对角线。
dtype:数据类型,可选。返回数组的数据类型。
order:可选。{‘C’,‘F’}是否在内存中以C或fortran(行或列)顺序存储多维数据。

import numpy as np
np.eye(2,dtype=int))
# 输出:
# array([[1, 0],
#        [0, 1]])

np.eye(3,k=1))
# 输出:
# array([[0., 1., 0.],
#        [0., 0., 1.],
#        [0., 0., 0.]])
  • numpy.fromfile(file, dtype=float, count=-1, sep=‘’, offset=0, *, like=None)

根据文本或二进制文件中的数据构建一个数组。

参数解析:

file:file或str或path
dtype:数据类型,可选。返回数组的数据类型,对于二进制文件,它用于确定文件中各项的大小和字节顺序。
count:int,要读取的项目数,-1表示所有项目(即完整文件)。
sep:str,如果文件是文本文件,则项目之间的分隔符,空(“”)分隔符表示文件应被视为二进制文件。分隔符中的空格(" ")匹配零个或多个空格字符。仅由空格组成的分隔符必须至少匹配一个空格。
offset:int,与文件当前位置的偏移量(以字节为单位)。仅允许用于二进制文件。

import numpy as np
a=np.arange(12)
a.shape=(3,4)
a.tofile("a.bin") #将数组中的数据以二进制格式写入文件。
b1=np.fromfile('a.bin',dtype=np.float)
b2=np.fromfile('a.bin',dtype=np.int)
b3=np.fromfile('c.bin',dtype=np.int32)
  • numpy.fromfunction(function, shape, *, dtype=<class ‘float’>, like=None, **kwargs)

通过对每个坐标执行函数来构造数组。返回调用function结果,因此fromfuntion的外形完全由function决定,如果function返回标量值,则fromfuntion的形状将与shape参数不匹配。

参数解析:

function:该函数使用 N 个参数调用,其中 N 是 shape 的等级。每个参数代表数组沿特定轴变化的坐标。例如,如果 shape 是 (2, 2) ,则参数将为 array([[0, 0], [1, 1]]) 和 array([[0, 1], [0, 1]])。
shape:输出数组的形状,它还确定传递给function的坐标数组的形状。
dtype:传递给function的坐标数组的数据类型,默认情况下,dtype为浮点型float。
like:允许创建非NumPy数组的引用对象,如果like传入的类似数组支持__array_function__协议,则结果将由它定义,在这种情况下,它确保创建一个与通过此参数传入的数组对象兼容的数组对象。

import numpy as np

def func1(x,y):
	return 10*x+y
b=np.fromfunction(func1,(5,4),dtype=np.int)
b

# 输出:
# array([[ 0,  1,  2,  3],
#        [10, 11, 12, 13],
#        [20, 21, 22, 23],
#        [30, 31, 32, 33],
#        [40, 41, 42, 43]])


np.fromfunction(lambda i,j:i=j,(3,3),dtype=int)
# 输出:
# array([[ True, False, False],
#        [False,  True, False],
#        [False, False,  True]])
  • numpy.identity(n, dtype=None, *, like=None)

返回一个单位矩阵,单位矩阵指主对角线上是1的方阵。

参数解析:

n:是输出n*n对角阵的行数(或列数)。
dtype:数据类型,可选。返回数组的数据类型,默认情况下,dtype为浮点型float。若dtype设为“bool”,则返回对角线元素为True其余元素为Flase的方阵。

import numpy as np
np.identity(3)
# 输出:
# array([[1., 0., 0.],
#        [0., 1., 0.],
#        [0., 0., 1.]])

np.identity(3,dtype=bool)
# 输出:
# array([[ True, False, False],
#        [False,  True, False],
#        [False, False,  True]])
  • numpy.linspace(start,stop,num=50, endpoint=True, retstep=False, dtype=None, axis=0)

返回间隔类均匀分布的数值序列。

参数解析:

start:参数数值范围的起始点,如果设置为0,则结果的第一个数为0,该参数必须提供。
stop:参数数值范围的终止点,通常为结果的最后一个值,如果修改endpoint=False,则结果中不包括该值。
num:int,可选,控制结果中有多少个元素,如num=5,则输出数组个数5,默认值为50。
endpoint:bool,可选,决定终止值 (stop参数指定)是否被包含在结果数组中,如果endpoin=True,结果中包括终止值,反之不包括,默认为True。
dtype:数据类型,可选,决定输出数组的数据类型,如果没有给定dtype参数,则数据类型根据’start‘和’stop’进行推断,

import numpy as np
np.linspace(2,3,num=5)
# 输出:
# array([2.  , 2.25, 2.5 , 2.75, 3.  ])

np.linspace(0,100,num=11)
# 输出:
# array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])

np.linspace(1,5,4,endpoint=False)
# 输出:
# array([1., 2., 3., 4.])

np.linspace(start = 0, stop = 100, num = 5, dtype = int)
# 输出:
# array([  0,  25,  50,  75, 100])
  • numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)

在指定的范围内生成等比数列数据的函数。以10为底数取对数,比如生成从10的1次方到10的4次方之间4个数,可以使用logspace(1, 4, 4)函数。

参数解析:

start:base**start序列的起始值。
stop:base**start序列的最终值,除非endpoint 为False。。
num:int,可选。要生成的样本数。默认值为50。
endpoint:bool,可选。如果为True,则停止的是最后一个样本,否则不包括在内。默认值为True。
base:float,可选。日志空间的基础。ln(samples)/ ln(base)(或log_base(samples))中元素之间的步长是一致的。
dtype:数据类型,可选,输出数组的类型。
axis:int,可选。

import numpy as np
np.logspace(0,3,4) # 生成10的0次方到10的3次方之间4个数
# 输出:
# array([   1.,   10.,  100., 1000.])

np.logspace(0,5,6,base=2) #生成2的0次方到2的5次方之间6个数。
# 输出:
# array([ 1.,  2.,  4.,  8., 16., 32.])
  • numpy.mgrid[start : end : step]

返回多维结构,常见的如2D、3D图形。

参数解析:

start:开始坐标。
stop:结束坐标。
step:步长。步长为复数表示总共个数,左闭右闭,步长为实数表示间隔,左闭右开。

import numpy as np 
np.mgrid[-5:5:3j]
# 输出:
# array([-5.,  0.,  5.])

np.mgrid[-5:5:3]
# 输出:
# array([-5, -2,  1,  4])

# 二维数组,x和y都是3*3的数组,x跨行方向即列方向与第一个参数一致,y为跨列方向即行方向与第二个参数一致。
x,y=np.mgrid[-5:5:3j,-2:2:3j]
x
# 输出:
# array([[-5., -5., -5.],
#       [ 0.,  0.,  0.],
#       [ 5.,  5.,  5.]])
y
# 输出:
# array([[-2.,  0.,  2.],
#        [-2.,  0.,  2.],
#        [-2.,  0.,  2.]])

# 三维数组,三维数组内的二维数组是由第一个参数-5:5:3j决定,为3,二维数组的行数由第二个参数决定,为3,二维数组的列数由第三个参数决定,为3。
x,y,z=np.mgrid[-5:5:3j,-2:2:3j,-1:1:3j]
x
# 输出:
# array([[[-5., -5., -5.],
#         [-5., -5., -5.],
#         [-5., -5., -5.]],

#        [[ 0.,  0.,  0.],
#         [ 0.,  0.,  0.],
#         [ 0.,  0.,  0.]],

#        [[ 5.,  5.,  5.],
#         [ 5.,  5.,  5.],
#         [ 5.,  5.,  5.]]])
y
# 输出:
# array([[[-2., -2., -2.],
#         [ 0.,  0.,  0.],
#         [ 2.,  2.,  2.]],

#        [[-2., -2., -2.],
#         [ 0.,  0.,  0.],
#         [ 2.,  2.,  2.]],

#        [[-2., -2., -2.],
#         [ 0.,  0.,  0.],
#         [ 2.,  2.,  2.]]])
z
# 输出:
# array([[[-1.,  0.,  1.],
#         [-1.,  0.,  1.],
#         [-1.,  0.,  1.]],

#        [[-1.,  0.,  1.],
#         [-1.,  0.,  1.],
#         [-1.,  0.,  1.]],

#        [[-1.,  0.,  1.],
#         [-1.,  0.,  1.],
#         [-1.,  0.,  1.]]])
  • numpy.ogrid[start : end : step]

打开的多维“网格网格”的实例。它在索引时返回一个开放的(即不充实的)网格,因此每个返回的数组只有一个维度大于1。输出数组的维数和数目等于索引维数。
ogrid函数产生的数组,第一个数组是以纵向产生的,即数组第二维的大小始终为1。第二个数组是以横向产生的,即数组第一维的大小始终为1。

参数解析:

start:开始坐标。
stop:结束坐标。
step:步长。步长为复数表示总共个数,左闭右闭,步长为实数表示间隔,左闭右开。

import numpy as np
np.ogrid[-1:1:5j]
# 输出:
# array([-1. , -0.5,  0. ,  0.5,  1. ])

np.ogrid[0:5:1,0:5:1]
# 输出:
# [array([[0],
#         [1],
#         [2],
#         [3],
#         [4]]),
#  array([[0, 1, 2, 3, 4]])]
  • numpy.ones(shape, dtype=None, order=‘C’, *, like=None)

返回给定形状和数据类型的新数组,其中元素的值设置为1。

参数解析:

shape:一个整数类型或一个整数元组,用于定义数组的大小。如果仅指定一个整数类型变量,则返回一维数组。如果指定的是整数元组,则返回给定形状的数组。
dtype:数据类型,可选,默认值为float。用于指定数组的数据类型。
order:可选。{‘C’,‘F’}是否在内存中以C或fortran(行或列)顺序存储多维数据。

import numpy as np
np.ones(5)
# 输出:
# array([1., 1., 1., 1., 1.])

np.ones(5,dtype=int)
# 输出:
# array([1, 1, 1, 1, 1])

np.ones((2,1))
# 输出:
# array([[1.],
#        [1.]])
  • numpy.ones_like(a, dtype=None, order=‘K’, subok=True, shape=None)

返回一个形状类型跟a一样,用1填充的数组。

参数解析:

a:类似数组的输入。
dtype:数据类型,可选,默认值为float。用于指定数组的数据类型。
order:可选。{‘C’,‘F’}是否在内存中以C或fortran(行或列)顺序存储多维数据。

import numpy as np
a=np.arange(6)
a.shape=(2,3)
np.ones_like(a)
# 输出:
# array([[1, 1, 1],
#        [1, 1, 1]])
  • numpy.zeros(shape, dtype=float, order=‘C’, *, like=None)

返回给定形状和数据类型的新数组,其中元素的值设置为0。

参数解析:

shape:一个整数类型或一个整数元组,用于定义数组的大小。如果仅指定一个整数类型变量,则返回一维数组。如果指定的是整数元组,则返回给定形状的数组。
dtype:数据类型,可选,默认值为float。用于指定数组的数据类型。
order:可选。{‘C’,‘F’}是否在内存中以C或fortran(行或列)顺序存储多维数据。

import numpy as np
np.zeros(5)
# 输出:
# array([0., 0., 0., 0., 0.])

np.zeros((5,0),dtype=int)
# 输出:
# array([], shape=(5, 0), dtype=int32)

np.zeros((2,1))
# 输出:
# array([[0.],
#        [0.]])
  • numpy.zeros_like(a, dtype=None, order=‘K’, subok=True, shape=None)

返回一个形状类型跟a一样,用0填充的数组。

参数解析:

a:类似数组的输入。
dtype:

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个错误提示,意思是“numpy.ndarray”对象没有“extend”属性。这通常是因为你尝试在一个numpy数组上调用“extend”方法,但是numpy数组没有这个方法。你需要使用其他方法来扩展numpy数组,比如使用numpy.concatenate()函数。 ### 回答2: 问题描述 当在使用 Python 编写程序时,如果程序出现错误 attributeerror: ‘numpy.ndarray’ object has no attribute ‘extend’(numpy.ndarray 对象没有属性‘extend’),这通常说明程序使用了不支持‘extend’方法的 numpy 数组类型,导致程序出错。 问题分析 在 Python numpy 可以用于进行数学计算、数据统计和数据分析等方面的操作。而 numpy 数组则是 numpy最重要的数据结构之一,可以用来存储和处理各种数据类型的多维数组。 但是,由于 numpy 数组是一个比内置列表(list)更加复杂的数据结构,因此 numpy 数组不是所有的方法都与内置列表兼容,如‘extend’方法就是 numpy 数组不支持的方法之一。 换句话说,如果 numpy 数组调用了‘extend’方法,那么 Python 解释器就会抛出‘attributeerror’异常,因为 numpy 数组类型本身不包含‘extend’方法。 解决方法 发生‘attributeerror: ‘numpy.ndarray’ object has no attribute ‘extend’’异常时,有以下一些解决方法。 1.使用 numpy提供的相关函数 由于 numpy 数组类型不支持‘extend’方法,那么可以使用 numpy提供的其他方法来完成相同的操作。例如,可以使用 numpy.append()函数在数组的末尾添加元素。 2.将 numpy 数组转换为内置列表 如果代码必须使用‘extend’方法,可以将 numpy 数组转换为内置列表,然后在列表使用‘extend’方法。例如: import numpy as np x = np.array([1, 2, 3]) y = [4, 5, 6] z = list(x) z.extend(y) 3.修改代码逻辑 如果‘extend’方法不是必须使用的,可以修改程序的代码逻辑,使用其他的操作方法代替。例如可以使用‘+’符号连接两个数组。 总之,在使用 numpy 数组进行编程时,要特别注意不要错误地使用不兼容的方法,并学习掌握 numpy提供的其他方法,以方便进行数据处理和分析。 ### 回答3: 这个错误是由于numpy数组对象没有extend属性导致的。在Python,extend是一个常见的方法,用于将一个序列的所有元素添加到另一个序列。然而,NumPy数组是一种不同类型的序列,它在Python被作为一种不同的对象来处理。 NumPy数组是一种高效的数据结构,它允许在数值计算使用大量的数字数据。NumPy数组支持大规模的数值计算,包括线性代数、傅里叶变换和统计分析。然而,由于NumPy数组是一种不同类型的对象,它不支持Python的所有常见方法和操作。 因此,当我们在NumPy数组使用extend方法时,会发生AttributeError错误。这个错误是由于NumPy数组对象没有extend属性而产生的。在这种情况下,我们需要使用NumPy的其他方法来实现相同的功能。 如果我们想要向一个NumPy数组添加元素,可以使用concatenate方法,它可以将两个或更多的数组连接起来。我们也可以使用append方法,将一个元素添加到数组末尾。另外,insert方法可以在指定位置插入一个元素。 总之,AttributeError: 'numpy.ndarray' object has no attribute 'extend'错误是由于在NumPy数组对象上使用了一个Python不支持的操作而导致的。为了解决这个问题,我们需要使用NumPy的其他方法来实现相同的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值