多个类型错误试图在列表理解中乘以列表的元素
Multiple TypeErrors trying to multiply elements of a list inside a list comprehension
我正在关注一本关于深度学习的书,这本书鼓励理解更方便的 numpy 替代方案背后的基本数学运算,以便更好地理解基本原理。我正在尝试在本机 Python 3.9 中重建 numpy 的乘法 (*) 运算符,但我遇到了一些我觉得非常混乱的 TypeErrors。希望有人能帮忙。
def multiply(a, b):
""" 1.) float * float
2.) float * vector
3.) float * matrix
4.) vector * vector
5.) vector * matrix
6.) matrix * matrix """
def float_float(float_a, float_b):
return float_a * float_b
def float_vector(float_a, vector_b):
return [float_float(float_a, component_b) for component_b in vector_b]
def float_matrix(float_a, matrix_b):
return [float_vector(float_a, vector_b) for vector_b in b]
def vector_vector(vector_a, vector_b):
return [a * b for a, b in dict(zip(vec_a, vec_b)).items()]
def vector_matrix(vector_a, matrix_b):
return [vector_vector(vector_a, vector_b) for vector_b in matrix_b]
def matrix_matrix(matrix_a, matrix_b):
return [vector_vector(a, b) for a, b in dict(zip(matrix_a, matrix_b)).items()]
def get_type(operand):
if type(operand) == float:
return "float"
elif type(operand) == list:
if any(isinstance(item, list) for item in operand):
return "matrix"
else:
return "vector"
types = (get_type(a), get_type(b))
print(types)
operations_table = {
("float", "float"): float_float(a, b),
("float", "vector"): float_vector(a, b),
("vector", "float"): float_vector(b, a),
("float", "matrix"): float_matrix(a, b),
("matrix", "float"): float_matrix(b, a),
("vector", "vector"): vector_vector(a, b),
("vector", "matrix"): vector_matrix(a, b),
("matrix", "vector"): vector_matrix(b, a),
("matrix", "matrix"): matrix_matrix(a, b)
}
return operations_table[types]
# float
f = 2.0
# vector
v = [0.5, 1.0, 2.0]
# matrix
m = [
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]
]
# TEST
print(multiply(f, f))
print(multiply(f, v))
print(multiply(v, m))
这是我在尝试多个 2 个浮点数时遇到的第一个类型错误:
('float', 'float')
Traceback (most recent call last):
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 62, in <module>
print(multiply(f, f))
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 38, in multiply
("float", "vector"): float_vector(a, b),
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 14, in float_vector
return [float_float(float_a, component_b) for component_b in vector_b]
TypeError: 'float' object is not iterable
这是我在尝试乘以 float * vector
时遇到的第二个 TypeError
('float', 'vector')
Traceback (most recent call last):
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 63, in <module>
print(multiply(f, v))
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 37, in multiply
("float", "float"): float_float(a, b),
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 12, in float_float
return float_a * float_b
TypeError: can't multiply sequence by non-int of type 'float'
非常感谢您提供任何帮助,因为在示例中,变量 f、v 和 m 中的所有值都专门设置为浮点数,所以我对我得到的错误类型感到非常惊讶。谢谢!!!
问题出在 operations_table 字典上。它导致所有版本的乘法总是 运行,无论操作数类型如何。我使用 eval() 将其更改为更短的解决方案,现在代码可以完美运行。
def multiply(a, b):
""" 1.) float * float
2.) float * vector
3.) float * matrix
4.) vector * vector
5.) vector * matrix
6.) matrix * matrix """
def float_float(float_a, float_b):
return float_a * float_b
def float_vector(float_a, vector_b):
return [float_float(float_a, component_b) for component_b in vector_b]
def float_matrix(float_a, matrix_b):
return [float_vector(float_a, vector_b) for vector_b in b]
def vector_vector(vector_a, vector_b):
return [a * b for a, b in list(zip(vector_a, vector_b))]
def vector_matrix(vector_a, matrix_b):
return [vector_vector(vector_a, vector_b) for vector_b in matrix_b]
def matrix_matrix(matrix_a, matrix_b):
return [vector_vector(a, b) for a, b in list(zip(matrix_a, matrix_b))]
def get_type(operand):
if type(operand) == float:
return "float"
elif type(operand) == list:
if any(isinstance(item, list) for item in operand):
return "matrix"
else:
return "vector"
types = (get_type(a), get_type(b))
print(types)
result = eval(f"{types[0]}_{types[1]}(a, b)")
return result
我正在关注一本关于深度学习的书,这本书鼓励理解更方便的 numpy 替代方案背后的基本数学运算,以便更好地理解基本原理。我正在尝试在本机 Python 3.9 中重建 numpy 的乘法 (*) 运算符,但我遇到了一些我觉得非常混乱的 TypeErrors。希望有人能帮忙。
def multiply(a, b):
""" 1.) float * float
2.) float * vector
3.) float * matrix
4.) vector * vector
5.) vector * matrix
6.) matrix * matrix """
def float_float(float_a, float_b):
return float_a * float_b
def float_vector(float_a, vector_b):
return [float_float(float_a, component_b) for component_b in vector_b]
def float_matrix(float_a, matrix_b):
return [float_vector(float_a, vector_b) for vector_b in b]
def vector_vector(vector_a, vector_b):
return [a * b for a, b in dict(zip(vec_a, vec_b)).items()]
def vector_matrix(vector_a, matrix_b):
return [vector_vector(vector_a, vector_b) for vector_b in matrix_b]
def matrix_matrix(matrix_a, matrix_b):
return [vector_vector(a, b) for a, b in dict(zip(matrix_a, matrix_b)).items()]
def get_type(operand):
if type(operand) == float:
return "float"
elif type(operand) == list:
if any(isinstance(item, list) for item in operand):
return "matrix"
else:
return "vector"
types = (get_type(a), get_type(b))
print(types)
operations_table = {
("float", "float"): float_float(a, b),
("float", "vector"): float_vector(a, b),
("vector", "float"): float_vector(b, a),
("float", "matrix"): float_matrix(a, b),
("matrix", "float"): float_matrix(b, a),
("vector", "vector"): vector_vector(a, b),
("vector", "matrix"): vector_matrix(a, b),
("matrix", "vector"): vector_matrix(b, a),
("matrix", "matrix"): matrix_matrix(a, b)
}
return operations_table[types]
# float
f = 2.0
# vector
v = [0.5, 1.0, 2.0]
# matrix
m = [
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]
]
# TEST
print(multiply(f, f))
print(multiply(f, v))
print(multiply(v, m))
这是我在尝试多个 2 个浮点数时遇到的第一个类型错误:
('float', 'float')
Traceback (most recent call last):
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 62, in <module>
print(multiply(f, f))
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 38, in multiply
("float", "vector"): float_vector(a, b),
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 14, in float_vector
return [float_float(float_a, component_b) for component_b in vector_b]
TypeError: 'float' object is not iterable
这是我在尝试乘以 float * vector
时遇到的第二个 TypeError('float', 'vector')
Traceback (most recent call last):
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 63, in <module>
print(multiply(f, v))
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 37, in multiply
("float", "float"): float_float(a, b),
File "e:\OneDrive\Projects\Deep_Learning\CH05\CH05-000_NativeOps.py", line 12, in float_float
return float_a * float_b
TypeError: can't multiply sequence by non-int of type 'float'
非常感谢您提供任何帮助,因为在示例中,变量 f、v 和 m 中的所有值都专门设置为浮点数,所以我对我得到的错误类型感到非常惊讶。谢谢!!!
问题出在 operations_table 字典上。它导致所有版本的乘法总是 运行,无论操作数类型如何。我使用 eval() 将其更改为更短的解决方案,现在代码可以完美运行。
def multiply(a, b):
""" 1.) float * float
2.) float * vector
3.) float * matrix
4.) vector * vector
5.) vector * matrix
6.) matrix * matrix """
def float_float(float_a, float_b):
return float_a * float_b
def float_vector(float_a, vector_b):
return [float_float(float_a, component_b) for component_b in vector_b]
def float_matrix(float_a, matrix_b):
return [float_vector(float_a, vector_b) for vector_b in b]
def vector_vector(vector_a, vector_b):
return [a * b for a, b in list(zip(vector_a, vector_b))]
def vector_matrix(vector_a, matrix_b):
return [vector_vector(vector_a, vector_b) for vector_b in matrix_b]
def matrix_matrix(matrix_a, matrix_b):
return [vector_vector(a, b) for a, b in list(zip(matrix_a, matrix_b))]
def get_type(operand):
if type(operand) == float:
return "float"
elif type(operand) == list:
if any(isinstance(item, list) for item in operand):
return "matrix"
else:
return "vector"
types = (get_type(a), get_type(b))
print(types)
result = eval(f"{types[0]}_{types[1]}(a, b)")
return result