计算两个矩阵的 Hadamard 乘积, 矩阵的 Hadamard 积就是两个同维矩阵的逐元素对应相乘,cij=aij×bij。要求输入矩阵的行/列数(在这里假设我们使用的是 n × n 的矩阵)

Python 有许多内建的数据结构。数据结构(data structure)是计算机中存储、组织数据的方式。

1、列表

序列是 Python 中最基本的数据结构。

序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。

Python 有 6 个序列的内置类型,但最常见的是列表和元组。

列表都可以进行的操作包括索引,切片,加,乘,检查成员。

此外,Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。

列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

list1 = ['Google', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]

2、访问列表中的值

与字符串的索引一样,列表索引从 0 开始,第二个索引是 1,依此类推。

python 列表乘法 python列表乘一个数字_python 矩阵元素变为整形

通过索引列表可以进行截取、组合等操作。

索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推。

python 列表乘法 python列表乘一个数字_list截取_02

使用下标索引来访问列表中的值,同样你也可以使用方括号 [] 的形式截取字符;列表截取可以接收第三个参数,参数作用是截取的步长。

3、更新列表

append() 方法来添加列表项

4、删除列表元素

del 语句来删除列表的的元素

5、列表操作符

表达式

描述

len( )

长度

+

组合

*

重复

In

元素是否存在于列表中

6、嵌套列表

使用嵌套列表即在列表里创建其它列表

7、列表函数

序号

函数

描述

1

len(list)

列表元素个数

2

max(list)

返回列表元素最大值

3

min(list)

返回列表元素最小值

4

list(seq)

将元组转换为列表

8、列表方法

序号

方法

描述

1

list.append(obj)

在列表末尾添加新的对象

2

list.count(obj)

统计某个元素在列表中出现的次数

3

list.extend(seq)

在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

4

list.index(obj)

从列表中找出某个值第一个匹配项的索引位置

5

list.insert(index, obj)

对象插入列表

6

list.pop([index=-1])

移除列表中的一个元素(默认最后一个元素),并且返回该元素的值

7

list.remove(obj)

移除列表中某个值的第一个匹配项

8

list.reverse()

反向列表中元素

9

list.sort( key=None, reverse=False)

对原列表进行排序

10

list.clear()

清空列表

11

list.copy()

复制列表

9、将列表当做堆栈使用

列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。

用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack
[3, 4, 5]

10、将列表当作队列使用

也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry")                 
>>> queue.popleft()                
'Eric'

11、列表推导式

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

#将列表中每个数值乘三,获得一个新的列表:
>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

用 if 子句作为过滤器:

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x 2]
[]

以下是一些关于循环和其它技巧的演示:

>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

列表推导式可以使用复杂表达式或嵌套函数:

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

12、嵌套列表解析

Python的列表还可以嵌套。

3X4的矩阵列表:

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

将3X4的矩阵列表转换为4X3列表:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

也可以使用以下方法来实现:

>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

另外一种实现方法:

>>> transposed = []
>>> for i in range(4):
...     transposed_row = []
...     for row in matrix:
...         transposed_row.append(row[i])
...     transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

13、del 语句

使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

也可以用 del 删除实体变量:

>>> del a

14、编程实现




计算两个矩阵的 Hadamard 乘积, 矩阵的 Hadamard 积就是两个同维矩阵的逐元素对应相乘,cij=aij×bij。要求输入矩阵的行/列数(在这里假设我们使用的是 n × n 的矩阵)

n = int(input("输入数字n: "))
print("输入矩阵A")
a = []
for i in range(n):    
    a.append([int(x) for x in input().split()])

print("输入矩阵B")
b = []
for i in range(n):
    b.append([int(x) for x in input().split()])

#计算Hadamard矩阵
c = []
for i in range(n):
    c.append([a[i][j] * b[i][j] for j in range(n)])

print("生成的Hadamard矩阵")
print("-" * 7 * n)   #分隔符-----

for x in c:
    for y in x:
        print(str(y).rjust(5), end=' ')
    print()
print("-" * 7 * n)    #分隔符-----

使用了几次列表推导式。

[int(x) for x in input().split()] 首先通过 input() 获得用户输入的字符串,再使用 split() 分割字符串得到一系列的数字字符串,然后用 int() 从每个数字字符串创建对应的整数值。

[a[i][j] * b[i][j] for j in range(n)] 来得到矩阵乘积的每一行数据。

15、rjust()

返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串。

str.rjust(width[, fillchar])
参数
width -- 指定填充指定字符后中字符串的总长度.
fillchar -- 填充的字符,默认为空格。