Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e88b939

Browse files
author
bat67
committed
update chapter3 and README
1 parent 460c884 commit e88b939

File tree

15 files changed

+260
-0
lines changed

15 files changed

+260
-0
lines changed

‎.gitignore‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
_book

‎3.NumPy-basics/Array_creation.md‎

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<!-- TOC -->
2+
3+
- [创建数组](#%E5%88%9B%E5%BB%BA%E6%95%B0%E7%BB%84)
4+
- [导言](#%E5%AF%BC%E8%A8%80)
5+
- [将Python类似数组的对象转换为NumPy数组](#%E5%B0%86python%E7%B1%BB%E4%BC%BC%E6%95%B0%E7%BB%84%E7%9A%84%E5%AF%B9%E8%B1%A1%E8%BD%AC%E6%8D%A2%E4%B8%BAnumpy%E6%95%B0%E7%BB%84)
6+
- [内置的NumPy数组创建](#%E5%86%85%E7%BD%AE%E7%9A%84numpy%E6%95%B0%E7%BB%84%E5%88%9B%E5%BB%BA)
7+
- [从磁盘读取数组](#%E4%BB%8E%E7%A3%81%E7%9B%98%E8%AF%BB%E5%8F%96%E6%95%B0%E7%BB%84)
8+
- [标准二进制格式](#%E6%A0%87%E5%87%86%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%A0%BC%E5%BC%8F)
9+
- [普通的ASCII格式](#%E6%99%AE%E9%80%9A%E7%9A%84ascii%E6%A0%BC%E5%BC%8F)
10+
- [自定义二进制格式](#%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%A0%BC%E5%BC%8F)
11+
- [特殊库的使用](#%E7%89%B9%E6%AE%8A%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8)
12+
13+
<!-- /TOC -->
14+
# 创建数组
15+
16+
> 原文:[Array creation](http://docs.scipy.org/doc/numpy-dev/user/basics.creation.html)
17+
18+
> 另见:
19+
[数组创建例程](http://docs.scipy.org/doc/numpy-dev/reference/routines.array-creation.html#routines-array-creation)
20+
21+
## 导言
22+
23+
数组创建的一般机制有五种:
24+
25+
- 从其它Python的结构转换(如列表和元组)
26+
- 内置的NumPy数组创建对象(如 `arange`, `ones`, `zeros`以及其它)
27+
- 从磁盘中读取标准或自定义格式的数据
28+
- 通过使用字符串或者缓冲区,从原始的字节创建数组
29+
- 使用特殊的库函数(比如`random`)
30+
31+
本节不会涉及复制和连接等扩展和转换现有数组的方法,也不会涉及创建对象数组和结构化数组。这些会在它们自己的章节中讲述。
32+
33+
## 将Python类似数组的对象转换为NumPy数组
34+
35+
通常,Python中排列为数组结构的数值数据可以通过`array()`函数来转换成数组,典型的例子就是列表和元组。具体使用方法请见`array()`函数的文档。一些对象也支持数组的协议,并且可以用这种方法转换成数组。辨识一个对象是否能转换为数组,最简单的方法就是在交互式环境中尝试这一方法,看看它是否有效(即Python之道)。
36+
37+
例如:
38+
39+
```python
40+
>>> x = np.array([2,3,1,0])
41+
>>> x = np.array([2, 3, 1, 0])
42+
>>> x = np.array([[1,2.0],[0,0],(1+1j,3.)]) # note mix of tuple and lists,
43+
and types
44+
>>> x = np.array([[ 1.+0.j, 2.+0.j], [ 0.+0.j, 0.+0.j], [ 1.+1.j, 3.+0.j]])
45+
```
46+
47+
## 内置的NumPy数组创建
48+
49+
NumPy具有从无到有创建数组的内置功能:
50+
51+
`zeros(shape)` 将创建一个填充为0的指定形状的数组。
52+
53+
```python
54+
>>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])
55+
```
56+
57+
`ones(shape)` 将创建一个填充为1的数组。在其他所有方面都和`zeros`相同。
58+
59+
`arange()`将创建有规律的增量值数组。它的几种用法请见docstring。这里给出几个例子:
60+
61+
```python
62+
>>> np.arange(10)
63+
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
64+
>>> np.arange(2, 10, dtype=np.float)
65+
array([ 2., 3., 4., 5., 6., 7., 8., 9.])
66+
>>> np.arange(2, 3, 0.1)
67+
array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])
68+
```
69+
70+
请注意,关于最后一个用例,有一些使用技巧,请见`arrange`的docstring。
71+
72+
`linspace()`将以指定数量的元素创建数组,并平分开始值和结束值。例如:
73+
74+
```python
75+
>>> np.linspace(1., 4., 6)
76+
array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ])
77+
```
78+
79+
这些创建函数的好处是,可以保证元素个数、起始点和结束点,`arange()`一般不会指定任意的起始值、结束值和步长。
80+
81+
`indices()`将创建数组的集合(用一维数组来模拟高维数组),每一维都有表示它的变量。一个例子说明比口头描述好得多:
82+
83+
```python
84+
>>> np.indices((3,3))
85+
array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])
86+
```
87+
88+
计算规则网格上的高维函数时,这会非常有用。
89+
90+
## 从磁盘读取数组
91+
92+
这大概是大数组创建的最常见情况。当然,细节取决于磁盘上的数据格式,所以这一节只能给出如何处理各种格式的一般建议。
93+
94+
### 标准二进制格式
95+
96+
各个领域都有数组数据的标准格式。以下列出了用于读取和返回NumPy数组的已知Python库(也有其它的库可以读取数组并转换为NumPy数组,所以也请看一下最后一节)
97+
98+
```python
99+
HDF5: PyTables
100+
FITS: PyFITS
101+
```
102+
103+
一些格式不能直接读取,但是不难将其转换为类似PIL库(能够读写许多图像格式,例如jpg、png以及其它)所支持的格式。
104+
105+
### 普通的ASCII格式
106+
107+
逗号分隔值文件(CSV)被广泛使用(可以被类似Excel的一些程序导入导出)。有一些在python中读取这些文件的方法,例如Python和pylab(Matplotlib的一部分)中的函数。
108+
109+
更通用的ASCII文件可以使用SciPy的IO包来读取。
110+
111+
### 自定义二进制格式
112+
113+
有多种方法可以使用。如果文件有一个相对简单的格式,那么你可以写一个简单的I/O库并使用`numpy fromfile()``tofile()`方法直接读写NumPy数组(注意字节顺序!)。如果有一个不错的C/C++库可以用于读取数据,则可以用各种技巧把它封装一下,虽然这可能要耗费一些工作量,也需要更多高级的知识来和C/C++交互。
114+
115+
### 特殊库的使用
116+
117+
有一些库可以用于生成特殊用途的数组,这样的库不可能全部列举出来。最常见的用法是使用许多数组生成函数来产生带有随机值的数组,以及使用一些生成特殊矩阵(如对角线)的功能函数。

‎3.NumPy-basics/Broadcasting.md‎

Whitespace-only changes.

‎3.NumPy-basics/Byte-swapping.md‎

Whitespace-only changes.

‎3.NumPy-basics/Data_types.md‎

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
<!-- TOC -->
2+
3+
- [数据类型](#%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B)
4+
- [数组类型和类型之间的转换](#%E6%95%B0%E7%BB%84%E7%B1%BB%E5%9E%8B%E5%92%8C%E7%B1%BB%E5%9E%8B%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BD%AC%E6%8D%A2)
5+
- [数组标量](#%E6%95%B0%E7%BB%84%E6%A0%87%E9%87%8F)
6+
- [扩展精度](#%E6%89%A9%E5%B1%95%E7%B2%BE%E5%BA%A6)
7+
8+
<!-- /TOC -->
9+
10+
# 数据类型
11+
12+
> 原文:[Data types](http://docs.scipy.org/doc/numpy-dev/user/basics.types.html)
13+
14+
> 另见:
15+
[数据类型对象](http://docs.scipy.org/doc/numpy-dev/reference/arrays.dtypes.html#arrays-dtypes)
16+
17+
## 数组类型和类型之间的转换
18+
19+
NumPy支持的数值类型比Python更多。这一节会讲述所有可用的类型,以及如何改变数组的数据类型。
20+
21+
| 数据类型 | 描述 |
22+
| --- | --- |
23+
| bool_ | 以字节存储的布尔值(True 或 False) |
24+
| int_ | 默认的整数类型(和 C 的 long 一样,是 int64 或者 int32) |
25+
| intc | 和 C 的 int 相同(一般为 int64 或 int32) |
26+
| intp | 用于下标的整数(和 C 的 ssize_t 相同,一般为int64 或者 int32) |
27+
| int8 | 字节(-128 到 127) |
28+
| int16 | 整数(-32768 到 32767) |
29+
| int32 | 整数(-2147483648 到 2147483647) |
30+
| int64 | 整数(-9223372036854775808 到 9223372036854775807) |
31+
| uint8 | 无符号整数(0 到 255) |
32+
| uint16 | 无符号整数(0 到 65535) |
33+
| uint32 | 无符号整数(0 到 4294967295) |
34+
| uint64 | 无符号整数(0 到 18446744073709551615) |
35+
| float_ | float64 的简写 |
36+
| float16 | 半精度浮点:1位符号,5位指数,10位尾数 |
37+
| float32 | 单精度浮点:1位符号,8位指数,23位尾数 |
38+
| float64 | 双精度浮点:1位符号,11位指数,52位尾数 |
39+
| complex_ | complex128 的简写 |
40+
| complex64 | 由两个32位浮点(实部和虚部)组成的复数 |
41+
| complex128 | 由两个64位浮点(实部和虚部)组成的复数 |
42+
43+
此外,Intel平台相关的C整数类型 `short``long`,`long long` 和它们的无符号版本是有定义的。
44+
45+
NumPy数值类型是dtype对象的实例,每个都有独特的特点。一旦你导入了NumPy:
46+
47+
```python
48+
>>> import numpy as np
49+
```
50+
51+
这些 dtype 都可以通过 `np.bool_` , `np.float32` 以及其它的形式访问。
52+
53+
更高级的类型不在表中给出,请见[结构化数组](http://docs.scipy.org/doc/numpy-dev/user/basics.rec.html#structured-arrays)一节。
54+
55+
有5种基本的数值类型:布尔(`bool`),整数(`int`),无符号整数(`uint`),浮点(`float`)和复数。其中的数字表示类型所占的位数(即需要多少位代表内存中的一个值)。有些类型,如`int``intp`,依赖于平台(例如32位和64位机)有不同的位数。在与低级别的代码(如C或Fortran)交互和在原始内存中寻址时应该考虑到这些。
56+
57+
数据类型可以用做函数,来将Python类型转换为数组标量(详细解释请见数组标量一节),或者将Python的数值序列转换为同类型的NumPy数组,或者作为参数传入接受dtype的关键词的NumPy函数或方法中,例如:
58+
59+
```python
60+
>>> import numpy as np
61+
>>> x = np.float32(1.0)
62+
>>> x
63+
1.0
64+
>>> y = np.int_([1,2,4])
65+
>>> y
66+
array([1, 2, 4])
67+
>>> z = np.arange(3, dtype=np.uint8)
68+
>>> z
69+
array([0, 1, 2], dtype=uint8)
70+
```
71+
72+
数组类型也可以由字符代码指定,这主要是为了保留旧的包的向后兼容,如Numeric。一些文档仍旧可能这样写,例如:
73+
74+
```python
75+
>>> np.array([1, 2, 3], dtype='f')
76+
array([ 1., 2., 3.], dtype=float32)
77+
```
78+
79+
我们推荐用 dtype 对象来取代。
80+
81+
要转换数组类型,使用 `.astype()` 方法(推荐),或者将类型自身用作函数,例如:
82+
83+
```python
84+
>>> z.astype(float)
85+
array([ 0., 1., 2.])
86+
>>> np.int8(z)
87+
array([0, 1, 2], dtype=int8)
88+
```
89+
90+
需要注意的是,上面我们使用Python的浮点对象作为 dtype。NumPy知道`int`是指`np.int_`,`bool``np.bool_`,`float``np.float_`,`complex``np.complex_ `。其他数据类型在Python中没有对应。
91+
92+
通过查看 dtype 属性来确定数组的类型:
93+
94+
```python
95+
>>> z.dtype
96+
dtype('uint8')
97+
```
98+
99+
dtype 对象还包含有关类型的信息,如它的位宽和字节顺序。数据类型也可以间接用于类型的查询属性,例如检查是否是整数:
100+
101+
```python
102+
>>> d = np.dtype(int)
103+
>>> d
104+
dtype('int32')
105+
106+
>>> np.issubdtype(d, int)
107+
True
108+
109+
>>> np.issubdtype(d, float)
110+
False
111+
```
112+
113+
## 数组标量
114+
115+
NumPy一般以数组标量返回数组元素(带有相关dtype的标量)。数组标量不同于Python标量,但他们中的大部分可以互换使用(一个主要的例外是2.x之前的Python,其中整数数组标量不能作为列表和元组的下标)。也有一些例外,比如当代码需要标量的一个非常特定的属性,或检查一个值是否是特定的Python标量时。一般来说,总是可以使用相应的Python类型函数(如`int`,`float`,`complex`,`str`,`unicode`),将数组标量显式转换为Python标量来解决问题。
116+
117+
使用数组标量的主要优点是,它们保留了数组的类型(Python可能没有匹配的标量类型,如`int16`)。因此,使用数组标量确保了数组和标量之间具有相同的行为,无论值在不在数组中。NumPy标量也有许多和数组相同的方法。
118+
119+
## 扩展精度
120+
121+
Python 的浮点数通常都是64位的,几乎相当于 `np.float64` 。在一些不常见的情况下,更精确的浮点数可能更好。是否可以这样做取决于硬件和开发环境:具体来说,x86 机器提供了80位精度的硬件浮点支持,虽然大多数 C 编译器都以 `long double` 类型来提供这个功能,但 MSVC (标准的Windows版本)中 `long double``double` 一致。NumPy中可以通过 `np.longdouble` 来使用编译器的 `long double` (复数为 `np.clongdouble` )。你可以通过 `np.finfo(np.longdouble)` 来了解你的 numpy 提供了什么。
122+
123+
NumPy 不提供比 C 的 `long double` 精度更高的 dtype;特别是128位 IEEE 四精度数据类型(Fortran 的 `REAL*16`)是不能用的。
124+
125+
为了高效的内存对齐,`np.longdouble`通常填充零位来存储,共96位或128位。哪个更有效取决于硬件环境;通常在32位系统中,他们被填充到96位,而在64位系统,他们通常是填充到128位。`np.longdouble` 以系统默认的方式填充;而 `np.float96``np.float128` 为那些需要特定填充位的用户提供。尽管名字不同,`np.float96``np.float128`都只提供和`np.longdouble`相同的精度,也就是说,大多数 x86 机器上面只有80位,标准Windows版本上只有64位。
126+
127+
注意,即使`np.longdouble`比Python的`float`精度更高,也很容易失去额外的精度,因为Python经常强行以`float`来传值。例如,`%`格式化运算符要求其参数转换成标准的Python类型,因此它不可能保留额外的精度,即使要求更多的小数位数。可以使用`1 + np.finfo(np.longdouble).eps`来测试你的代码。

‎3.NumPy-basics/IO_with_NumPy.md‎

Whitespace-only changes.

‎3.NumPy-basics/Indexing.md‎

Whitespace-only changes.

‎3.NumPy-basics/README.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# NumPy基础
2+
3+
- [数据类型](Data_types.md)
4+
- [创建数组](Array_creation.md)
5+
- [](IO_with_NumPy.md)
6+
- [](Indexing.md)
7+
- [](Broadcasting.md)
8+
- [](Byte-swapping.md)
9+
- [](Structured_arrays.md)
10+
- [](Subclassing_ndarray.md)

‎3.NumPy-basics/Structured_arrays.md‎

Whitespace-only changes.

‎3.NumPy-basics/Subclassing_ndarray.md‎

Whitespace-only changes.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /