小言_互联网的博客

看完这篇要是还不会使用Numpy创建数组,就找块豆腐撞死

373人阅读  评论(0)

引言

本文作者接触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)
参数 描述
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 序列的终止值,如果endpointtrue,该值包含于数列中
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。如果endpointtrue,该值包含于数列中
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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场