• 2020-11-27 23:51:08

如果python使用numpy创建多维数组会比较简单

但是不用numpy呢?

二维数组的创建：

3行10列的二维数组的创建：

m = [[0]*3 for _ in range(10)]

或者

m = [[0]*3]*10

我们来检查一下数组创建的对不对

for i in range(10):

for j in range(3):

try:

if (m[i][j] != 0): print(i,j)

except:

print(i,j,"error")

没有输出error有关的东西，正确！

三维数组的创建：

4行3列，Z=2的三维数组的创建：

m = [[[0] * 2 for _ in range(3) ] for _ in range(4)]

或者

m = [[[0]*2]*3]*4

检查：

for i in range(4):

for j in range(3):

for k in range(2):

try:

if (m[i][j][k] != 0): print(i, j,k);

except:

print(i,j,k ,"error")

没有输出error有关的东西，正确！

接下来多维数组的创建也就很简单了

m = [.....[[0]*q]*w]*e]*r]*t]*y]*u]*.........]

更多相关内容
• 本文实例讲述了Python操作多维数组输出和矩阵运算。分享给大家供大家参考，具体如下： 在许多编程语言中（Java，COBOL，BASIC），多维数组或者矩阵是（限定各维度的大小）预先定义好的。而在Python中，其实现更简单...
• x in enumerate(new)] for old, new in zip(old_arr, new_arr)] print(new_arr) 哪些输出： ^{pr2}$更新： 下面是一个处理相邻单元的暴力解决方案：old_arr = [[8,8,8,8,0,0,0,0,6,6,5,5], [8,8,8,8,0,0,0,0,6,6,5... 假设old_arr和new_arr长度相同，可以这样做：old_arr = [[8,8,8,8,0,0,0,0,6,6,5,5], [8,8,7,0,0,0,0,0,6,6,5,5]] new_arr = [[9,9,6,7,3,6,5,0,6,4,3,4], [9,0,6,7,4,6,5,0,6,4,3,4]] new_arr = [[x if old[i] else 0 for i, x in enumerate(new)] for old, new in zip(old_arr, new_arr)] print(new_arr) 哪些输出： ^{pr2}$

更新：

下面是一个处理相邻单元的暴力解决方案：old_arr = [[8,8,8,8,0,0,0,0,6,6,5,5],

[8,8,8,8,0,0,0,0,6,6,5,5],

[8,8,8,8,0,0,0,0,6,6,5,5],

[8,8,8,8,0,0,0,0,6,6,5,5]]

new_arr = [[9,9,6,7,3,6,5,0,6,4,3,4],

[9,9,6,7,3,6,5,0,6,4,3,4],

[9,9,6,7,3,6,5,0,6,4,3,4],

[9,9,6,7,3,6,5,0,6,4,3,4]]

def first_last(row, next_row, old, new):

for i in range(len(new[row])):

count = 0

if old[row][i] == 0:

if old[row][i-1] == 0:

count += 1

if old[row][i+1] == 0:

count += 1

if old[next_row][i] == 0:

count += 1

if old[next_row][i-1] == 0:

count += 1

if old[next_row][i+1] == 0:

count += 1

if count > 4:

new[row][i] = 0

def middle(old, new):

for i, l in enumerate(new[1:-1]):

for j in range(len(l)):

count = 0

if old[i][j] == 0:

if old[i][j-1] == 0:

count += 1

if old[i][j+1] == 0:

count += 1

if old[i-1][j] == 0:

count += 1

if old[i-1][j-1] == 0:

count += 1

if old[i-1][j+1] == 0:

count += 1

if old[i+1][j] == 0:

count += 1

if old[i+1][j-1] == 0:

count += 1

if old[i+1][j+1] == 0:

count += 1

if count > 4:

l[j] = 0

# first row

first_last(0, 1, old_arr, new_arr)

# middle rows

middle(old_arr, new_arr)

# last row

first_last(-1, -2, old_arr, new_arr)

print(new_arr)

哪些输出：[[9, 9, 6, 7, 3, 0, 0, 0, 6, 4, 3, 4],

[9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4],

[9, 9, 6, 7, 0, 0, 0, 0, 6, 4, 3, 4],

[9, 9, 6, 7, 3, 0, 0, 0, 6, 4, 3, 4]]

注意：这可以做得更好，但您可以根据自己的喜好对其进行优化。在

展开全文
• 可以将这些行转换为1D数组，使用元素作为二维索引，并使用^{}。然后，使用^{}给我们每个唯一行的开始位置，并且还有一个可选参数return_counts来给我们计数。因此，实现将如下所示-def unique_rows_counts(a):# ...

可以将这些行转换为1D数组，使用元素作为二维索引，并使用^{}。然后，使用^{}给我们每个唯一行的开始位置，并且还有一个可选参数return_counts来给我们计数。因此，实现将如下所示-def unique_rows_counts(a):

# Calculate linear indices using rows from a

lidx = np.ravel_multi_index(a.T,a.max(0)+1 )

# Get the unique indices and their counts

_, unq_idx, counts = np.unique(lidx, return_index = True, return_counts=True)

# return the unique groups from a and their respective counts

return a[unq_idx], counts

样本运行-

^{pr2}\$

标杆管理

假设您可以将numpy数组或集合作为输出，那么可以对迄今为止提供的解决方案进行基准测试，如下-

功能定义：import numpy as np

from collections import Counter

def unique_rows_counts(a):

lidx = np.ravel_multi_index(a.T,a.max(0)+1 )

_, unq_idx, counts = np.unique(lidx, return_index = True, return_counts=True)

return a[unq_idx], counts

def map_Counter(a):

return Counter(map(tuple, a))

def forloop_Counter(a):

c = Counter()

for x in a:

c[tuple(x)] += 1

return c

时间安排：In [53]: a = np.random.randint(0,4,(10000,5))

In [54]: %timeit map_Counter(a)

10 loops, best of 3: 31.7 ms per loop

In [55]: %timeit forloop_Counter(a)

10 loops, best of 3: 45.4 ms per loop

In [56]: %timeit unique_rows_counts(a)

1000 loops, best of 3: 1.72 ms per loop

展开全文
• Numpy中定义的最终对象是称为ndarray的N维数组类型。它描述相同类型的元素集合。可以使用基于零的索引访问集合中的项目。ndarray创建方式array()函数接收一个普通的python序列，并将其转换为ndarray。numpy.array...

Numpy中定义的最终对象是称为ndarray的N维数组类型。它描述相同类型的元素集合。可以使用基于零的索引访问集合中的项目。

ndarray创建方式

array()函数

接收一个普通的python序列，并将其转换为ndarray。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

序号

参数

描述

1

object

任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。

2

dtype

数组的所需数据类型，可选。

3

copy

可选，默认为true，对象是否被复制。

4

order

C(按行)、F(按列)或A(任意，默认)。

5

subok

默认情况下，返回的数组被强制为基类数组。如果为true，则返回子类。

6

ndimin

指定返回数组的最小维数。import numpy as np

# 例子01

a = np.array([1,2,3])

print(a)

print(type(a))

# 多于一个维度

a2 = np.array([[1,2],[3,4]])

print(a2)

# 最小维度

a3 = np.array([1,2,3,4,5],ndmin = 2)

print(a3)

empty()函数

创建指定形状和dtype的未初始化数组

numpy.empty(shape, dtype = float, order = 'C')

序号

参数

描述

1

Shape

空数组的形状，整数或整数元组

2

Dtype

所需的输出数组类型，可选

3

Order

'C’为按行的 C 风格数组，'F’为按列的 Fortran 风格数组import numpy as np

#例: 数组元素为随机值

arr = np.empty((3,3),dtype = 'i1')

print(arr)

zeros()函数

创建指定长度或者形状的全零数组。

# 例

arr = np.zeros((3,3))

print(arr)

# 自定义类型

arr = np.zeros((3,3), dtype = [('x', 'i4'), ('y', 'i4')])

print(arr)

ones()函数

创建指定长度或者形状的全1数组。

arr = np.ones((2,3,4))

print(arr)

# 自定义类型

arr = np.ones((3,3), dtype = [('x', 'i4'), ('y', 'i4')])

print(arr)

asarray()函数

类似 numpy.array 可以将Python序列转换为ndarray。

# 来自列表

arr = [1,2,3,4]

arr2 = np.asarray(arr)

print(arr2)

print(type(arr))

print(type(arr2))

# 来自元组

arr = (1,2,3,4)

arr2 = np.asarray(arr)

print(arr2)

print(type(arr))

print(type(arr2))

# 来自元组列表

arr = [(1,2,3,4),(5,6,7,8)]

arr2 = np.asarray(arr)

print(arr2)

print(type(arr))

print(type(arr2))

arange()函数

类似python的range函数，通过指定开始值、终值和步长来创建一个一维数组，注意：最终创建的数组不包含终值。

numpy.arange(start,stop,step,dtype)

arr = np.arange(5,dtype = float)

print(arr)

linspace()函数

通过指定开始值、终值和元素个数来创建一个一维数组，数组的数据元素符合等差数列，可以通过endpoint关键字指定是否包含终值，默认包含终值。

等差数列

numpy.linspace(start,stop,num,endpoint,retstep,dtype)

序号

参数

描述

1

start

起始值

2

stop

结束值

3

num

生成等间隔样例的数量，默认为50

4

endpoint

序列中是否包含stop 值 默认为 Truearr = np.linspace(10,20,9)

print(arr)

arr = np.linspace(10,20,5,endpoint=False)

print(arr)

arr = np.linspace(10,20,5,retstep=True)

print(arr) #返回步长

logspace()函数

和linspace函数类似，不过创建的是等比数列数组。

numpy.logscale(start, stop, num, endpoint, base, dtype)

序号

参数

描述

1

start

起始值是base ** start

2

stop

终止值是base ** stop

3.

num

范围内的数值数量，默认为50

4

endpoint

如果为true，终止值包含在输出数组当中

5

base

对数空间的底数，默认为10

6

dtype

输出数组的数据类型，如果没有提供，则取决于其它参数arr = np.logspace(0,2,5)

# 0表示10的0次方，2表示10的2次方，5表示最终生成元素数量为5

print(arr)

arr1 = np.logspace(1,10,5,base = 2)

print(arr1)

random()函数

使用随机数填充数组，即使用numpy.random中的random()函数来创建0-1之间的随机元素，数组包含的元素数量由参数决定。

序号

参数

描述

1

rand

返回 0 - 1 随机值

2

randn

返回一个样本具有标准正态分布

3

randint

返回随机的整数，位于半开区间[low,hight)size = 10 (3,3)

4

random_integers(low[, high, size])

返回随机的整数，位于闭区间

5

random

返回随机浮点数arr = np.random.rand(9).reshape(3,3)

print(arr)

arr = np.random.rand(3,2,3)

print(arr)

arr = np.random.randn(9).reshape(3,3)

print(arr)

arr = np.random.randn(3,2,3)

print(arr)

arr = np.random.randint(1,9,size = (2,4))

print(arr)

arr = np.random.random_integers(1,9,size =(2,4))

print(arr)

arr = np.random.random((3,2,3))

print(arr)

arr = np.random.randn(3,2,3)

print(arr)

ndarray对象属性

shape

数组的维度。

这个数组属性返回一个包含数组维度的元组，它也可以用于调整数组大小。

a = np.array([[1,2,3],[4,5,6]])

print(a) # [[1 2 3]

#[4 5 6]]

print(a.shape) # (2, 3)

调整数组大小

a = np.array([[1,2,3],[4,5,6]])

a.shape=(3,2)

print(a)

reshape 调整数组大小。

a = np.array([[1,2,3],[4,5,6]])

b = a.reshape(3,2)

print(b)

ndim

数组轴(维度)的个数。

a = np.arange(24)

print(a)

print(a.ndim)

b = a.reshape(2,4,3)

print(b)

print(b.ndim)

print(b.shape)

itemsize

数组中每个元素的字节大小。

#数组的int8 一个字节

x = np.array([1,2,3,4,5], dtype = np.int8)

print(x.itemsize)

数组的float32 4个字节

x = np.array([1,2,3,4,5], dtype = np.float32)

print(x.itemsize)

size

数组元素的总个数,等于shape属性中元组元素的乘积。

arr = np.arange(18).reshape(2,3,3)

print(type(str(arr)))

print(arr.shape)

print(arr.size)

dtype

描述数组中元素类型的对象。

数据类型

类型简写

说明

int_

默认整形

intc

等价于long的整形

int8

i1

字节整形，1个字节，范围:[-128,127]

int16

i2

整形,2个字节,范围:[-32768,32767]

int32

i3

整形,4个字节,范围:[-2^31, 2^31-1]

int64

i4

整形,8个字节,范围:[-2^63, 2^63-1]

uint8

u1

无符号整形, 1个字节, 范围:[0,255]

uint16

u2

无符号整形, 2个字节, 范围:[0,65535]

uint32

u3

无符号整形, 1个字节, 范围:[0, 2^32-1]

uint64

u4

无符号整形, 1个字节, 范围:[0,2^64-1]

bool_

以一个字节形成存储的布尔值(True或者False)

float_

float64简写形式

float16

f2

半精度浮点型(2字节)：1符号位+5位指数+10位的小数部分

float32

f4或者f

单精度浮点型(4字节)：1符号位+8位指数+23位的小数部分

float64

f8或者d

双精度浮点型(8字节)：1符号位+11位指数+52位的小数部分

complex_

c16

complex128的简写形式

complex64

c8

complex128的简写形式

complex128

c16

复数，由两个64位的浮点数来表示

object

O

Python对象类型

String_

S

固定长度的字符串类型(每个字符1个字节)，比如：要创建一个长度为8的字符串，应该使用S8

Unicode_

U

固定长度的unicode类型的字符串(每个字符占用字节数由平台决定)，长度定义类似String_类型import numpy as np

# 使用数组标量类型

dt = np.dtype(np.int32)

print(dt)

# int8，int16，int32，int64 可替换为等价的字符串 'i1'，'i2'，'i4'，以及其他。

dt = np.dtype('i4')

print(dt)

结构化数据类型

dt = np.dtype([('age',np.int8)])

print(dt)

#将结构化数据应用于ndarray对象

dt = np.dtype([('age',np.int8)])

a = np.array([(10,),(20,),(30,)],dtype = dt)

print(a)

#访问age列内容

dt = np.dtype([('age','i1')])

a = np.array([(10,),(20,),(30,)],dtype = dt)

print(a['age'])

#结构化数据包含多个字段

student = np.dtype([('name','S20'),('age','i1'),('marks','f4')])

a = np.array([('joe',20,80),('susan',22,85),('tom',23,90),('fank',23,33)],dtype=student)

print(a)

print(a['name'])

每个数据类型都有一个类型代码，即简写方式!

布尔值

符号整数

无符号整数

浮点

复数浮点

时间间隔

日期时间

Python 对象

字节串

Unicode

原始数据(void)

b

i

u

f

c

m

M

O

S\a

U

V

展开全文
• # 输出数组的行和列数 print(x.shape) # (4,5 ) # 只输出行数 print(x.shape[0]) # 4 # 只输出列数 print(x.shape[1]) # 5 2.图片数组 import cv2 img=cv2.imread(r'E:\pythonpycharm\yuan_Faster-RCNN
• 这意味着x[t]将是一个三维数组，即使{}本身只是一个二维数组。在 注意，在结果的形状(3,3,3)中，前两个{}由高级索引t贡献，最后一个{}由隐式基本索引:贡献。这两个指标t和{}也使用不同的方法得出各自的贡献。来自...
• ## Python多维数组切片

千次阅读 2020-12-19 11:11:52
2. list切片类似C数组，多维度分别用”[]“索引，单维度切片用”:“，如：>>> a[[1, 2, 3], [4, 5, 6], [7, 8, 9]]>>> a[1][1:3][5, 6]但是这样做第二个维度索引不起作用：>>> a[1:3][0:...
• 多维数组ndarray访问、修改字段访问、基本切片高级索引Numpy算数运算Numpy矩阵积Numpy广播 ndarray访问、修改 ndarray对象的内容可以通过索引或者切片来访问和修改，就像python的内置容器对象一样。 ndarray对象中的...
• 您可能感兴趣的文章:Python操作多维数组输出和矩阵运算示例python读取图片的方式,以及将图片以三维数组的形式输出方法python实现将一个数组逆序输出的方法python中实现将多个print输出合成一个数组Python实现二维...
• python多维数组变一维数组 b=a.flatten() #将多维数组变为1维数组 具体代码如下： import numpy as np #1.随机生成一个4行3列的多维数组a a=np.random.randn(4,3) print(a) print(type(a)) #输出结果： [[-0....
• 多维数组 一维 通用数学函数 基础 NumPy 的主要对象是齐次多维数组。它是一个元素表（通常是元素是数字），其中所有元素类型都相同，元素以正整数元组索引。在 NumPy 维度（dimension）被称为轴（axis）。 ps....
• 展开全部在Python中，一个像这样的多维表格可以通过“序列的序636f707962616964757a686964616f31333365646263列”实现。一个表格是行的序列。每一行又是独立单元格的序列。这类似于我们使用的数学记号，在数学里我们...
• 遍历这个数组，当然维数不确定的话你就需要使用递归，然后一一判断它的值是否为你指定的值，然后输出索引。另外，建议不要匿名提问，因为这会让很多高手不屑于回答你的问题。追问：能具体帮写一下吗？我试了好多次都...
• 今天就针对多维数组展开来写博客numpy其一部分功能如下：1.ndarray，是具有矢量算术运算且节省空间的多维数组。2.可以用于对整组的数据快速进行运算的辨准数学函数。3.能够用于读写磁盘数据的工具以及用于操作系统...
• #变成多维数组 a1 = a.reshape([4, 5]) print(a1) #尝试降维，失败 a2 = a1.reshape(1,20) print(a2) #尝试降维，失败 a3 = a1.reshape(20,1) print(a3) #尝试降维，成功：即reshape函数只需要一个输入量即可。若...
• Python中初始化一个5 x 3每项为0的数组，最好方法是：multilist=[[0forcolinrange(5)]forrowinrange(3)]我们知道，为了初始化一个一维数组，我们可以这样做：alist=[0]*5没错，那我们初始化一个二维数组时，是否可以...
• 另一种选择是多维列表位置索引：import numpy as npncol = 10 # 10 in your casenrow = 500 # 500 in your case# just creating some test data:x = np.arange(ncol*nrow).reshape(nrow,ncol)y = (ncol * np.random....
• #函数：用于将多维数组左右拆分成两份 # def DvdArr(arr,n): for i in range(len(a)): for j in range(len(a[0])): a[i][j]=random.random() print("原a数组：") print(a) [b11,b12]=a[:,0:2]#按列切分，从第1...
• 它只是指定了输出数组的形状。因此，在您的示例中，您需要告诉numpy，前5个值将从a[0]中提取，后5个值将从a[1]中提取。容易的！在>>> a[[[0]*5,[1]*5],index] 它在N维中变得很复杂，但是让我们对我上面定义的三维...
• Python中初始化一个5 x 3每项为0的数组，最好方法是：multilist=[[0forcolinrange(5)]forrowinrange(3)]我们知道，为了初始化一个一维数组，我们可以这样做：alist=[0]*5没错，那我们初始化一个二维数组时，是否可以...
• 今天就针对多维数组展开来写博客numpy其一部分功能如下：1.ndarray，是具有矢量算术运算且节省空间的多维数组。2.可以用于对整组的数据快速进行运算的辨准数学函数。3.能够用于读写磁盘数据的工具以及用于操作系统...
• 直接用len()函数只能得到最外面一层[]的维度。 因此，先把list转成numpy数组，再用numpy数组的shape属性获取数组维度。
• 您可能感兴趣的文章:在Python中输入一个以空格为间隔的数组方法python分割文件的常用方法python分割列表（list）的方法示例python多维数组切片方法python使用pandas实现数据分割实例代码对Python 数组的切片操作...

...