我是一个需要在某些事情上使用Python的Matlab用户,如果有人可以帮我解决Python语法,我将非常感激:
(1)是否可以通过Python中的元组索引列表?如果是这样,我该怎么做?例如,我想用它来表示数据矩阵。
(2)假设我可以使用由元组索引的列表,比如数据[(row,col)],如何删除整个列?我知道在Matlab中,我可以做类似
的事情 new_data = [data(:,1:x-1) data(:,x+1:end)];
如果我想从数据中删除列x。
(3)如何轻松计算每行中非负元素的数量。例如,在Matlab中,我可以这样做:
sum(data>=0,1)
这会给我一个列向量,表示每行中的非负数条目。
非常感谢!
答案 0 :(得分:8)
你应该研究numpy,这是为了这种事情。
答案 1 :(得分:3)
答案 2 :(得分:2)
以下是如何在numpy中轻松创建数组(矩阵)的示例:
>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
这是如何显示
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
以及如何获取行或列:
>>> a[0,:]
array([1, 2, 3])
>>> a[:,0]
array([1, 4, 7])
希望示例中的语法清晰! Numpy相当强大。
答案 3 :(得分:2)
我同意所有人的意见。使用Numpy / Scipy。但这里是您问题的具体答案。
是。索引可以是内置列表,也可以是Numpy数组。假设x = scipy.array([10, 11, 12, 13])
和y = scipy.array([0, 2])
。然后x[[0, 2]]
和x[y]
都返回相同的内容。
new_data = scipy.delete(data, x, axis=0)
(data>=0).sum(axis=1)
小心:示例2说明了Numpy / Scipy常见的陷阱。如例3所示,axis
属性通常设置为0以沿阵列的第一维操作,1设置为沿第二维操作,依此类推。但是像delete
这样的命令实际上颠倒了维度的顺序,如例2所示。你知道,行主要与列主要有关。
答案 4 :(得分:1)
您可以通过重载内置列表的__getitem__和__setitem__方法来扩展列表功能以允许使用元组进行索引。请尝试以下代码:
class my_list(list):
def __getitem__(self, key):
if isinstance(key, tuple) and len(key) > 0:
temp = []
for k in key: temp.append(list.__getitem__(self, k))
return temp
else:
return list.__getitem__(self, key)
def __setitem__(self, key, data):
if isinstance(key, tuple) and len(key) > 0:
for k in key: list.__setitem__(self, k, data)
else:
list.__setitem__(self, key, data)
if __name__ == '__main__':
L = my_list([1, 2, 3, 4, 5])
T = (1,3)
print(L[T])
答案 5 :(得分:0)
(1) 我认为你不能使用元组作为python列表的索引。您可以使用列表列表(例如[i] [j]),但似乎这不是您的观点。您可以使用其键为元组的字典。
d = { (1,1):1, (2,1):2 ... }
(2) 如果你不介意表现,
map( lambda x: d.remove(x) if x[1] = col_number, d.keys() )
(3) 您也可以使用过滤器来执行此操作。
sum(
map( lambda x:x[1], filter(lambda x,y: x[1] == row_num and y > 0, d.items()))
)
答案 6 :(得分:0)
不,不是一个列表可以被除整数之外的任何东西索引的情况。然而,字典是另一种情况。字典是包含键值对的哈希表。密钥必须是唯一且不可变的。值可以是任何类型的对象,包括整数,元组,列表或其他字典。对于您的示例,元组可以作为键,因为它们是不可变的。另一方面,列表不是,因此也不能是字典键。
您提出的一些功能可以实现为字典和列表推导的组合。其他人则需要对字典进行子类化并添加方法来实现所需的功能。