我有一个形状为public class Logger
{
private ActionBlock<string> block;
public Logger(string filePath)
{
block = new ActionBlock<string>(async message => {
using(var f = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Write))
{
f.Position = f.Length;
using(var sw = new StreamWriter(f))
{
await sw.WriteLineAsync(message);
}
}
}, new ExecutionDataflowBlockOptions{MaxDegreeOfParallelism = 1});
}
public void Log(string message)
{
block.Post(message);
}
}
的numpy数组X
。
每行的最后一个值可以是(768, 8)
或0
,我只需要值为1
的行,并调用此1
。
我做了:
T
这是正确的,但是,现在这是一个列表,而不是一个numpy数组(实际上我无法打印T = [x for x in X if x[7]==1]
)。
我应该怎么做才能让它成为一个numpy数组呢?
答案 0 :(得分:2)
NumPy的布尔索引以完全向量化的方式完成工作。与使用列表推导和类型转换相比,这种方法通常更有效(并且可以说更优雅)。
T = X[X[:, -1] == 1]
演示:
In [232]: first_columns = np.random.randint(0, 10, size=(10, 7))
In [233]: last_column = np.random.randint(0, 2, size=(10, 1))
In [234]: X = np.hstack((first_columns, last_column))
In [235]: X
Out[235]:
array([[4, 3, 3, 2, 6, 2, 2, 0],
[2, 7, 9, 4, 7, 1, 8, 0],
[9, 8, 2, 1, 2, 0, 5, 1],
[4, 4, 4, 9, 6, 4, 9, 1],
[9, 8, 7, 6, 4, 4, 9, 0],
[8, 3, 3, 2, 9, 5, 5, 1],
[7, 1, 4, 5, 2, 4, 7, 0],
[8, 0, 0, 1, 5, 2, 6, 0],
[7, 9, 9, 3, 9, 3, 9, 1],
[3, 1, 8, 7, 3, 2, 9, 0]])
In [236]: mask = X[:, -1] == 1
In [237]: mask
Out[237]: array([False, False, True, True, False, True, False, False, True, False], dtype=bool)
In [238]: T = X[mask]
In [239]: T
Out[239]:
array([[9, 8, 2, 1, 2, 0, 5, 1],
[4, 4, 4, 9, 6, 4, 9, 1],
[8, 3, 3, 2, 9, 5, 5, 1],
[7, 9, 9, 3, 9, 3, 9, 1]])
答案 1 :(得分:0)
致电
outImg = bsxfun(@times, img, cast(connected, class(img)));
您正在将T = [x for x in X if x[8]==1]
作为列表。要将任何列表转换为numpy数组,只需使用:
T
以下是发生的事情:
T = numpy.array([x for x in X if x[8]==1])