Задача 5
Бурение скважин для добычи золота
В рамках проекта по анализу геологических данных вы работаете с датасетом, содержащим информацию о концентрации золота в различных точках месторождения. Месторождение представлено в виде сетки 7x7, где каждая ячейка содержит значение концентрации золота:
  • gold_concentration представляет концентрацию золота в каждой точке сетки 7x7 месторождения;
  • drilling_locations содержит координаты пяти предполагаемых точек бурения.
import numpy as np

np.random.seed(5555)
gold_concentration = np.random.randint(low=0, high=10,
size=(7,7))

print(gold_concentration)
# [[2 3 0 5 2 0 3]
#  [8 8 0 7 1 5 3]
#  [0 1 6 2 1 4 5]
#  [4 0 8 9 9 8 7]
#  [4 2 7 0 7 2 1]
#  [9 8 9 2 5 0 8]
#  [1 9 8 2 6 4 3]]

drilling_locations = np.array([
[0,4],
[2,2],
[2,3],
[5,1],
[6,3]
])
Ваша задача:
  • Извлечь значения концентрации золота для заданных точек бурения.
  • Рассчитать среднюю концентрацию золота по выбранным точкам.

  • Определить точку с наибольшей концентрацией золота среди выбранных.

  • Визуализировать данные, используя тепловую карту для отображения концентрации золота по всему месторождению, отметив на ней точки бурения.

  • Предложить следующие 5 наилучших точек для бурения, основываясь на анализе данных.
Вам предстоит решить более сложную задачу — вычислить свертку двух многомерных массивов:
  • arr — массив размером 33x33x3, который можно рассматривать как 33x33 сетку, где каждая ячейка содержит 3-канальные данные (например, как в изображениях с тремя цветными каналами — RGB).
  • arr_filter — массив размером 5x5x3, который представляет собой фильтр для свертки.

Решение
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

def generate_gold_concentration(size=(7, 7), seed=5555):
np.random.seed(seed)
return np.random.randint(low=0, high=10, size=size)

def analyze_drilling_results(gold_concentration, drilling_locations):
drilled_concentrations = gold_concentration[drilling_locations[:, 0], drilling_locations[:, 1]]
   
mean_concentration = np.mean(drilled_concentrations)
max_concentration_index = np.argmax(drilled_concentrations)
max_concentration_location = drilling_locations[max_concentration_index]
max_concentration_value = drilled_concentrations[max_concentration_index]
return drilled_concentrations, mean_concentration, max_concentration_location, max_concentration_value

def find_top_drilling_points(gold_concentration, drilling_locations, n=5):
masked_concentration = np.copy(gold_concentration)
masked_concentration[drilling_locations[:, 0], drilling_locations[:, 1]] = -1
top_indices = np.argpartition(masked_concentration.ravel(), -n)[-n:]
top_points = [(np.unravel_index(i, gold_concentration.shape), gold_concentration[np.unravel_index(i, gold_concentration.shape)]) for i in top_indices]
return sorted(top_points, key=lambda x: x[1], reverse=True)

def visualize_gold_concentration(gold_concentration, drilling_locations, max_concentration_location):
    
plt.figure(figsize=(10, 10))
sns.heatmap(gold_concentration, annot=True, cmap="YlOrBr", cbar=True)

for loc in drilling_locations:
plt.scatter(loc[1] + 0.5, loc[0] + 0.5, color='red', s=120, edgecolor='black', marker='o', label='Пробуренные скважины' if loc[0] == drilling_locations[0][0] else "")

plt.scatter(max_concentration_location[1] + 0.5, max_concentration_location[0] + 0.5, 
                
color='blue', s=150, edgecolor='black', marker='*', label='Максимальная концентрация')

plt.title("Тепловая карта концентрации золота")
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), ncol=2)
plt.tight_layout()
plt.show()

def main():
gold_concentration = generate_gold_concentration()
drilling_locations = np.array([[0,4], [2,2], [2,3], [5,1], [6,3]])
drilled_concentrations, mean_concentration, max_concentration_location, max_concentration_value = 
analyze_drilling_results(gold_concentration, drilling_locations)
top_points = find_top_drilling_points(gold_concentration, drilling_locations)
print(f"Концентрация золота в пробуренных скважинах: {drilled_concentrations}")
print(f"Средняя концентрация золота в пробуренных скважинах: {mean_concentration:.1f}")
    
print(f"Скважина с наивысшей концентрацией золота среди пробуренных: координаты {max_concentration_location}, концентрация — {max_concentration_value}")
print("\nСледующие 5 наилучших точек для бурения:")
for i, ((x, y), concentration) in enumerate(top_points):
print(f"{i+1}. Точка: [{x}, {y}], концентрация золота — {concentration}")
    
    

visualize_gold_concentration(gold_concentration, drilling_locations, max_concentration_location)

if __name__ == "__main__":
main()
Результат 💡
Концентрация золота в пробуренных скважинах: [2 6 2 8 2]
Средняя концентрация золота в пробуренных скважинах: 4.0
Скважина с наивысшей концентрацией золота среди пробуренных: координаты [5 1], концентрация — 8  

Следующие 5 наилучших точек для бурения: 
Точка: [5, 0], концентрация золота — 92. 
Точка: [6, 1], концентрация золота — 93. 
Точка: [5, 2], концентрация золота — 94. 
Точка: [3, 4], концентрация золота — 95. 
Точка: [3, 3], концентрация золота — 9
Тепловая карта месторождения