英文:
Python list of lists comprehension
问题
我有一个包含列表的列表V,如果将其转换为一个numpy数组,其形状为(9945,1024)。每个内部列表都包含一些值,我想创建一个包含值低于某个阈值的列表的列表。例如,如果我有:
a = [[1,3,4],[1,0,1],[0,5,1]]
并且我只想要小于2的值,我应该得到:
a = [[1],[1,0,1],[0,5,1]]
我该如何实现这个?
我首先尝试使用布尔值:
boolean_V = ([V[i] >= V_max for i in range(0,len(V))])
然后我做了:
V_new = V[boolean_V]
但我发现(一旦转换)得到的numpy数组形状为(3090669)。我该怎么办?
英文:
I have a list of lists V which, if converted in a numpy array, has a shape (9945,1024). Each list inside contain some value, and I want to create a list of lists which contains lists with values under a certain treshold. For instance, if I have:
a = [[1,3,4],[1,0,1],[0,5,1]]
and I want only values less than 2, I should have:
a = [[1],[1,0,1],[0,5,1]]
How can I get this?
I tried first with a boolean:
boolean_V = ([V[i] >= V_max for i in range (0,len(V))])
And then I did:
V_new = V[boolean_V]
But I find (once converted) a numpy array of shape (3090669). What can I do?
答案1
得分: 1
以下是翻译好的部分:
问题之一是我们有一个大小为 AxB 的数组。鉴于我们使用的是 numpy 数组,在筛选之后,我们仍然需要一个 AxB 数组。但是,如果将其转换为列表,我们可以得到不同大小的行。可以使用以下方式实现:
filter_list = [[val for val in row if val < 2] for row in a]
如果您仍然需要它是一个 numpy 数组,您可以将此列表转换为一个 numpy 数组,并指定 dtype=object
以适应不同的行大小。
filter_array = np.array(filter_list, dtype=object)
您还可以使用以下方式创建一个掩码,指示满足条件的位置:
mask = np.abs(test) < 2
print(mask)
这将返回一个类似尺寸的数组,指示每个索引处的值是否满足条件。
英文:
One of the problems is we have an AxB sized array. Given we are using a numpy array, after we filter, we still need to have an AxB array. However, if we turn this into a list, we can have different sized rows. This can be achieved with something like this:
filter_list = [[val for val in row if val < 2] for row in a]
If you do still need it to be a numpy array, you can convert this list to a numpy array, and specify dtype=object
for varied row sizes.
filter_array = np.array(filter_list, dtype=object)
You could also make a mask with something like this to indicate what positions meet the condition
mask = np.abs(test) < 2
print(mask)
array([[ True, False, False],
[ True, True, True],
[ True, False, True]])
Which will given back a similar dimensioned array telling if that val at each index met the condition
答案2
得分: 0
这段代码的中文翻译如下:
threshold = 2
b = [[j for j in i if j <= threshold] for i in a]
英文:
Does this work:
threshold = 2
b = [[j for j in i if j <= threshold] for i in a]
答案3
得分: 0
如果您希望最终结果是一个可能长度不相等的列表,可以像这样做:
for row in range(V):
V[row] = list(filter(lambda x : x <= V_max, V[row]))
这将遍历大列表内的每个列表,并仅保留低于设置的阈值的值。
英文:
If you want the final result to be a list of not necessarily equal lengths you can do something like this:
for row in range(V):
V[row] = list(filter(lambda x : x <= V_max, V[row]))
This would iterate through each list inside the big list and keep only the values below the set threshold.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论