Вы можете просто использовать np.ix_
для такого вещания, например:
x_indexed = x[np.ix_(row_indices,col_indices)]
Пример прогона -
In [221]: x
Out[221]:
array([[17, 39, 88, 14, 73, 58, 17, 78],
[88, 92, 46, 67, 44, 81, 17, 67],
[31, 70, 47, 90, 52, 15, 24, 22],
[19, 59, 98, 19, 52, 95, 88, 65],
[85, 76, 56, 72, 43, 79, 53, 37],
[74, 46, 95, 27, 81, 97, 93, 69],
[49, 46, 12, 83, 15, 63, 20, 79]])
In [222]: row_indices
Out[222]: [4, 2, 5, 4, 1]
In [223]: col_indices
Out[223]: [1, 2]
In [224]: np.ix_(row_indices,col_indices) # Broadcasting of indices
Out[224]:
(array([[4],
[2],
[5],
[4],
[1]]), array([[1, 2]]))
In [225]: x[np.ix_(row_indices,col_indices)]
Out[225]:
array([[76, 56],
[70, 47],
[46, 95],
[76, 56],
[92, 46]])
As , предложенный OP , это действует так же, как передача старой школы с версией 2D-массива row_indices
, которая имеет свои элементы / индексы отправленные до axis=0
и, таким образом, создавая одномерную размерность в axis=1
и, таким образом, позволяя вещание с col_indices
. Таким образом, у нас было бы альтернативное решение, подобное этому -
In [227]: x[np.array(row_indices)[:,None],col_indices]
Out[227]:
array([[76, 56],
[70, 47],
[46, 95],
[76, 56],
[92, 46]])
У классов fstream нет функций для доступа или обработки имени, используемого для открытия файла, а в стандартной библиотеке C ++ нет функций обработки имен файлов - вам придется писать код самостоятельно, либо использовать стороннюю библиотеку или функции, предоставляемые операционной системой.
Вы не можете, std::ifstream
не хранит эту информацию.
Что вы можете сделать, однако, это:
использовать библиотеку типа Boost.Filesystem для преобразования между относительными и абсолютными путями.
boost::filesystem::path abs_path = boost::filesystem::complete("./rel/path");
std::string abs_path_str = abs_path.string();
Я не думаю, что это возможно для std::fstream. Я сделал это для FILE * в Windows (не портативным способом). См. от объекта файла к имени файла.
Вы не думали о расширении ifstream собственным классом, который запоминает имя файла?
.