引言
本文作者接触NumPy模块时对其中的创建数组的方法一直都是一知半解的状态,有时候在做tensorflow搭建模块时经常会出现特别低级的数组构建错误,而且错误形式千奇百怪,今天终于决定系统地重写认识一下如何使用NumPy创建数组。
查询了很多文章和书籍,把查阅到的所有创建方式做一个总结,以便后面查阅。
NumPy之创建数组
根据Python社区的习惯,可以以下面的方式导入NumPy模块
import numpy as np
生成数组
(1) 通过array函数生成数组
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数说明:
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
一般我们只需要指定object参数即可
a = np.array([1,2,3])
print(a)
[1 2 3]
a = np.array([[1,2],[2,3]]) # 注意方括号或圆括号是嵌套的
b = np.array(([1,2],[3,4]))
print(b)
print(a)
a = np.array([1,2],[2,3]) #错误
[[1 2]
[3 4]]
[[1 2]
[2 3]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-31aeb3a66568> in <module>
3 print(b)
4 print(a)
----> 5 a = np.array([1,2],[2,3]) #错误
TypeError: data type not understood
## 注意object的形式上的区别导致结果的区别
a =np.array([1,2])
print(a)
a = np.array((1,2))
print(a)
a = np.array([(1,2),()])
print(a)
a = np.array([[1,2],[2]])
print(a)
a = np.array([[1,2],[2,3]])
print(a)
b = np.array([[1,2],[2,3],[3,4]])
print(b)
print(b.ndim)
c = np.array([[[1,2],[2,3],[3,4]]])
print(c)
print(c.ndim) # 维度取决于方括号嵌套的次数
[1 2]
[1 2]
[(1, 2) ()]
[list([1, 2]) list([2])]
[[1 2]
[2 3]]
[[1 2]
[2 3]
[3 4]]
2
[[[1 2]
[2 3]
[3 4]]]
3
# 创建数组时设置最小维度
c = np.array([1,2,3,4,5],ndmin=2)
print(c)
print(c.ndim) # ndim--维度,矩阵的秩
[[1 2 3 4 5]]
2
# 传教数组时指定数组元素的数据类型
d = np.array([1,2,34,55,66],dtype=complex)
print(d)
[ 1.+0.j 2.+0.j 34.+0.j 55.+0.j 66.+0.j]
(2) numpy.empty创建数组
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
numpy.empty(shape, dtype = float, order = 'C')
参数说明:
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
虽然创建的数组是3行两列,但是数组中的元素未初始化,是一堆随机值,注意:形状不等于该矩阵的维度!
x = np.empty([3,2],dtype = int)
print(x)
print(x.ndim) # 2
[[620 0]
[620 0]
[ 1 0]]
2
(3) numpy.zeros
创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')
参数说明
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选,默认未浮点数 |
order | ‘C’ 用于 C 的行数组,或者 ‘F’ 用于 FORTRAN 的列数组 |
y = np.zeros([3,2])
print(y)
print(y.ndim)
[[0. 0.]
[0. 0.]
[0. 0.]]
2
# 设置类型为整数
y = np.zeros((5,),dtype=np.int)
print(y)
[0 0 0 0 0]
# 自定义类型
z = np.zeros((2,2),dtype=[('x','i4'),('y','i4')])
print(z)
[[(0, 0) (0, 0)]
[(0, 0) (0, 0)]]
(4)numpy.ones
创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape, dtype = None, order = 'C')
x =np.ones(5)
print(x)
[1. 1. 1. 1. 1.]
x =np.ones([2,3],dtype=int)
print(x)
[[1 1 1]
[1 1 1]]
(5)从已有的数据创建数组
- numpy.asarray
numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a, dtype = None, order = None)
参数 | 描述 |
---|---|
a | 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组 |
dtype | 数据类型,可选 |
order | 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
import numpy as np
x =[1,2,3] # 定义一个列表
# 通过asarray将列表转化为数组
a_x = np.asarray(x)
print(a_x)
[1 2 3]
# 将元组转换为 ndarray:
x=(1,2,3)
a=np.asarray(x)
print(a)
print(type(a))
[1 2 3]
<class 'numpy.ndarray'>
# 将元组列表转换为 ndarray:
x = [(1,2,3),(4,5)]
a = np.asarray(x)
print(a)
print(type(a))
print(a.ndim)
[(1, 2, 3) (4, 5)]
<class 'numpy.ndarray'>
1
# 设置了 dtype 参数:
x = [1,2,3]
a = np.asarray(x,dtype=float)
print(a)
[1. 2. 3.]
- numpy.frombuffer
- numpy.frombuffer 用于实现动态数组。
- numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
注意:buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring,即在原str前加上b。
参数 | 描述 |
---|---|
buffer | 可以是任意对象,会以流的形式读入。 |
dtype | 返回数组的数据类型,可选 |
count | 读取的数据数量,默认为-1,读取所有数据。 |
offset | 读取的起始位置,默认为0。 |
s = b'Hello World'
a = np.frombuffer(s, dtype = 'S1')
print (a)
[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']
s = input('please input a string,i will return your a array!')
a_s =np.frombuffer(bytes(s, encoding = "utf8") ,dtype='S1' )
print(a_s)
print(type(a_s))
please input a string,i will return your a array!ASDAS
[b'A' b'S' b'D' b'A' b'S']
<class 'numpy.ndarray'>
- numpy.fromiter
- numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
numpy.fromiter(iterable, dtype, count=-1)
- numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
参数 | 描述 |
---|---|
iterable | 可迭代对象 |
dtype | 返回数组的数据类型 |
count | 读取的数据数量,默认为-1,读取所有数据 |
mylist=[1,2,3,4,5]
it=iter(mylist)
# 使用迭代器创建 ndarray
x=np.fromiter(it, dtype=float)
print(x)
print(type(x))
print(x.ndim) #注意这个方法返回的数组都是一维的
[1. 2. 3. 4. 5.]
<class 'numpy.ndarray'>
1
# 案例 文本转向量
def txt2vec(self, text, vec_type=list):
"""Converts a string to a vector (list of ints).
First runs a sentence tokenizer, then a word tokenizer.
``vec_type`` is the type of the returned vector if the input is a string.
"""
if vec_type == np.ndarray:
res = np.fromiter(
(self[token] for token in self.tokenize(str(text))),
np.int
)
elif vec_type == list or vec_type == tuple or vec_type == set:
res = vec_type((self[token] for token in self.tokenize(str(text))))
else:
raise RuntimeError('Type {} not supported by dict'.format(vec_type))
assert type(res) == vec_type
return res
(6) 从数值范围创建数组
- numpy 包中的 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
参数 | 描述 |
---|---|
start |
起始值,默认为0 |
stop |
终止值(不包含) |
step |
步长,默认为1 |
dtype |
返回ndarray 的数据类型,如果没有提供,则会使用输入数据的类型。 |
# 生成0~5的数组
import numpy as np
x = np.arange(5)
# 设置了 dtype
x = np.arange(5,dtype=float)
print(type(x))
print(x)
<class 'numpy.ndarray'>
[0. 1. 2. 3. 4.]
# 设置了起始值、终止值及步长还有dtype:
x = np.arange(10,20,2,float)
print (x)
[10. 12. 14. 16. 18.]
- numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数 | 描述 |
---|---|
start |
序列的起始值 |
stop |
序列的终止值,如果endpoint 为true ,该值包含于数列中 |
num |
要生成的等步长的样本数量,默认为50 |
endpoint |
该值为 true 时,数列中中包含stop 值,反之不包含,默认是True。 |
retstep |
如果为 True 时,生成的数组中会显示间距,反之不显示。 |
dtype |
ndarray 的数据类型 |
import numpy as np
a =np.linspace(1,10,20) # 设置起始点为 1 ,终止点为 10,数列个数为 20。
print(a)
[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105
3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632
6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158
9.52631579 10. ]
# 设置元素全部是1的单位数列:
a = np.linspace(1,1,10)
print(a)
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
# 将 endpoint 设为 false,不包含终止值:
a = np.linspace(10, 20, 5, endpoint = False)
print(a)
# 将 endpoint 设为 true,包含终止值:
a = np.linspace(10, 20, 5, endpoint = True,dtype=int)
print(a)
[10. 12. 14. 16. 18.]
[10 12 15 17 20]
# 设置间距retstep
a =np.linspace(1,10,10,retstep= True)
print(a)
(array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0)
- numpy.logspace 函数用于创建一个于等比数列。格式如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
参数 | 描述 |
---|---|
start |
序列的起始值为:base ** start |
stop |
序列的终止值为:base ** stop。如果endpoint 为true ,该值包含于数列中 |
num |
要生成的等步长的样本数量,默认为50 |
endpoint |
该值为 true 时,数列中中包含stop 值,反之不包含,默认是True。 |
base |
对数 log 的底数。 |
dtype |
ndarray 的数据类型 |
import numpy as np
# 默认底数是 10
a = np.logspace(1.0, 2.0, num = 10) # start=10**1 end=10**2
print (a)
# 设置底数是2,得到的数组元素分别为:2^0,2^1,2^2....2^9 总共10个元素
a = np.logspace(0,9,10,base=2)# start=2**0,end=2**9
print (a)
# 设置底数是4,得到的数组元素分别为:4^0,4^1,4^2....4^9 总共10个元素
a = np.logspace(0,9,10,base=4)
print (a)
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
[ 1. 2. 4. 8. 16. 32. 64. 128. 256. 512.]
[1.00000e+00 4.00000e+00 1.60000e+01 6.40000e+01 2.56000e+02 1.02400e+03
4.09600e+03 1.63840e+04 6.55360e+04 2.62144e+05]
转载:https://blog.csdn.net/qq_41819729/article/details/105512747
查看评论