我的矩阵看起来像这样。
['Hotel', ' "excellent"', ' "very good"', ' "average"', ' "poor"', ' "terrible"', ' "cheapest"', ' "rank"', ' "total reviews"']
['westin', ' 390', ' 291', ' 70', ' 43', ' 19', ' 215', ' 27', ' 813']
['ramada', ' 136', ' 67', ' 53', ' 30', ' 24', ' 149', ' 49', ' 310 ']
['sutton place', '489', ' 293', ' 106', ' 39', ' 20', ' 299', ' 24', ' 947']
['loden', ' 681', ' 134', ' 17', ' 5', ' 0', ' 199', ' 4', ' 837']
['hampton inn downtown', ' 241', ' 166', ' 26', ' 5', ' 1', ' 159', ' 21', ' 439']
['shangri la', ' 332', ' 45', ' 20', ' 8', ' 2', ' 325', ' 8', ' 407']
['residence inn marriott', ' 22', ' 15', ' 5', ' 0', ' 0', ' 179', ' 35', ' 42']
['pan pacific', ' 475', ' 262', ' 86', ' 29', ' 16', ' 249', ' 15', ' 868']
['sheraton wall center', ' 277', ' 346', ' 150', ' 80', ' 26', ' 249', ' 45', ' 879']
['westin bayshore', ' 390', ' 291', ' 70', ' 43', ' 19', ' 199', ' 813']
我想从中移除顶行和第0列并创建一个新矩阵。
我该怎么做?
通常在java或者Id中使用以下代码:
for (int y; y< matrix[x].length; y++)
for(int x; x < matrix[Y].length; x++)
{
if(x == 0 || y == 0)
{
continue
}
else
{
new_matrix[x][y] = matrix[x][y];
}
}
在python中是否存在迭代和选择性复制元素的方法?
由于
修改
我还试图将每个矩阵元素从一个字符串转换为一个浮点数,当我迭代矩阵时。
这是我根据以下答案更新的修改后的代码。
A = []
f = open("csv_test.csv",'rt')
try:
reader = csv.reader(f)
for row in reader:
A.append(row)
finally:
f.close()
new_list = [row[1:] for row in A[1:]]
l = np.array(new_list)
l.astype(np.float32)
print l
但是我收到了错误
--> l.astype(np.float32)
print l
ValueError: setting an array element with a sequence.
答案 0 :(得分:5)
如果您有一个列表列表,那么:
new_list = [row[1:] for row in current_list[1:]]
因此,创建一个忽略第一行的新矩阵,对于之后的每一行,忽略第一列。
如果碰巧是numpy.array
,那么您可以使用:
your_array[1:,1:]
答案 1 :(得分:3)
以下是我提出的建议:
>>> import numpy as np
>>> l = [['hotel','good','bad'],['hilton',1,2],['ramada',3,4]]
>>> a = np.array(l) # convert to a numpy array to make multi-dimensional slicing possible
>>> a
array([['hotel', 'good', 'bad'],
['hilton', '1', '2'],
['ramada', '3', '4']],
dtype='|S4')
>>> a[1:,1:] # exclude the first row and the first column
array([['1', '2'],
['3', '4']],
dtype='|S4')
>>> a[1:,1:].astype(np.float32) # convert to float
array([[ 1., 2.],
[ 3., 4.]], dtype=float32)
您可以将2d列表传递给numpy数组构造函数,将2d数组切片以除去第一行和列,然后使用astype
方法将所有内容转换为浮点数。
全部在一行,那就是:
>>> l = [['hotel','good','bad'],['hilton',1,2],['ramada',3,4]]
>>> np.array(l)[1:,1:].astype(np.float32)
array([[ 1., 2.],
[ 3., 4.]], dtype=float32)
你得到一个ValueError
,因为你实际上有一个锯齿状阵列。使用问题代码中的变量new_list
,您可以自己证明:
>>> [len(x) for x in new_list]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 8]
最后一行的长度仅为8,而不是9,与所有其他行一样。给定2d锯齿状列表,numpy.array
构造函数将创建一个带有dtype
object
的1d numpy数组。该数组中的条目是Python列表。 astype
调用正在尝试将Python列表转换为失败的float32
。我猜这只是人为错误的一个例子。如果您修复了缺失的条目,那么您应该好好去。
答案 2 :(得分:0)
嵌套列表推导是您所需要的。例如:
def remove_from_matrix(matrix, columns, rows):
return [
[float(matrix[row_num][col_num])
for col_num in range(len(matrix[row_num]))
if not col_num in columns]
for row_num in range(len(matrix))
if not row_num in rows]